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/18 14:28:59 UTC

[plc4x] branch develop updated: feat(cbus): implemented trigger control application

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 9b9f88209 feat(cbus): implemented trigger control application
9b9f88209 is described below

commit 9b9f8820986461f9affefc6e007b78260b3f49ac
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Mon Jul 18 16:28:52 2022 +0200

    feat(cbus): implemented trigger control application
---
 plc4go/protocols/cbus/readwrite/ParserHelper.go    |   4 +
 plc4go/protocols/cbus/readwrite/XmlParserHelper.go |   4 +
 plc4go/protocols/cbus/readwrite/model/Language.go  | 665 ++++++++++++++
 .../cbus/readwrite/model/LightingDataLabel.go      |  14 +-
 .../cbus/readwrite/model/LightingLabelFlavour.go   |  26 +-
 .../cbus/readwrite/model/LightingLabelOptions.go   |  38 +-
 .../cbus/readwrite/model/LightingLanguage.go       | 665 --------------
 .../cbus/readwrite/model/SALDataTriggerControl.go  |  54 +-
 .../protocols/cbus/readwrite/model/StaticHelper.go |  10 +
 .../readwrite/model/TriggerControlCommandType.go   | 153 ++++
 .../model/TriggerControlCommandTypeContainer.go    | 966 +++++++++++++++++++++
 .../cbus/readwrite/model/TriggerControlData.go     | 294 +++++++
 .../model/TriggerControlDataIndicatorKill.go       | 155 ++++
 .../readwrite/model/TriggerControlDataLabel.go     | 300 +++++++
 .../model/TriggerControlDataTriggerEvent.go        | 191 ++++
 .../model/TriggerControlDataTriggerMin.go          | 155 ++++
 .../readwrite/model/TriggerControlLabelFlavour.go  | 145 ++++
 ...belOptions.go => TriggerControlLabelOptions.go} | 126 +--
 .../readwrite/model/TriggerControlLabelType.go     | 145 ++++
 .../java/cbus/readwrite/utils/StaticHelper.java    |  11 +
 .../org/apache/plc4x/java/cbus/ReferenceTest.java  |  35 +
 .../src/main/resources/protocols/cbus/c-bus.mspec  | 129 ++-
 22 files changed, 3504 insertions(+), 781 deletions(-)

diff --git a/plc4go/protocols/cbus/readwrite/ParserHelper.go b/plc4go/protocols/cbus/readwrite/ParserHelper.go
index 72a04d6bf..258ca34e5 100644
--- a/plc4go/protocols/cbus/readwrite/ParserHelper.go
+++ b/plc4go/protocols/cbus/readwrite/ParserHelper.go
@@ -40,6 +40,8 @@ func (m CbusParserHelper) Parse(typeName string, arguments []string, io utils.Re
 		return model.ApplicationAddress1Parse(io)
 	case "RequestContext":
 		return model.RequestContextParse(io)
+	case "TriggerControlData":
+		return model.TriggerControlDataParse(io)
 	case "NetworkNumber":
 		return model.NetworkNumberParse(io)
 	case "RequestTermination":
@@ -173,6 +175,8 @@ func (m CbusParserHelper) Parse(typeName string, arguments []string, io utils.Re
 		return model.ExtendedStatusHeaderParse(io)
 	case "CustomTypes":
 		return model.CustomTypesParse(io)
+	case "TriggerControlLabelOptions":
+		return model.TriggerControlLabelOptionsParse(io)
 	case "StatusHeader":
 		return model.StatusHeaderParse(io)
 	case "EncodedReply":
diff --git a/plc4go/protocols/cbus/readwrite/XmlParserHelper.go b/plc4go/protocols/cbus/readwrite/XmlParserHelper.go
index a90e54b7b..02a84b13d 100644
--- a/plc4go/protocols/cbus/readwrite/XmlParserHelper.go
+++ b/plc4go/protocols/cbus/readwrite/XmlParserHelper.go
@@ -50,6 +50,8 @@ func (m CbusXmlParserHelper) Parse(typeName string, xmlString string, parserArgu
 		return model.ApplicationAddress1Parse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
 	case "RequestContext":
 		return model.RequestContextParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
+	case "TriggerControlData":
+		return model.TriggerControlDataParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
 	case "NetworkNumber":
 		return model.NetworkNumberParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
 	case "RequestTermination":
@@ -198,6 +200,8 @@ func (m CbusXmlParserHelper) Parse(typeName string, xmlString string, parserArgu
 		return model.ExtendedStatusHeaderParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
 	case "CustomTypes":
 		return model.CustomTypesParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
+	case "TriggerControlLabelOptions":
+		return model.TriggerControlLabelOptionsParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
 	case "StatusHeader":
 		return model.StatusHeaderParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
 	case "EncodedReply":
diff --git a/plc4go/protocols/cbus/readwrite/model/Language.go b/plc4go/protocols/cbus/readwrite/model/Language.go
new file mode 100644
index 000000000..96cbac723
--- /dev/null
+++ b/plc4go/protocols/cbus/readwrite/model/Language.go
@@ -0,0 +1,665 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package model
+
+import (
+	"github.com/apache/plc4x/plc4go/internal/spi/utils"
+	"github.com/pkg/errors"
+	"github.com/rs/zerolog/log"
+)
+
+// Code generated by code-generation. DO NOT EDIT.
+
+// Language is an enum
+type Language uint8
+
+type ILanguage interface {
+	Serialize(writeBuffer utils.WriteBuffer) error
+}
+
+const (
+	Language_NO_LANGUAGE                Language = 0x00
+	Language_ENGLISH                    Language = 0x01
+	Language_ENGLISH_AUSTRALIA          Language = 0x02
+	Language_ENGLISH_BELIZE             Language = 0x03
+	Language_ENGLISH_CANADA             Language = 0x04
+	Language_ENGLISH_CARRIBEAN          Language = 0x05
+	Language_ENGLISH_IRELAND            Language = 0x06
+	Language_ENGLISH_JAMAICA            Language = 0x07
+	Language_ENGLISH_NEW_ZEALAND        Language = 0x08
+	Language_ENGLISH_PHILIPPINES        Language = 0x09
+	Language_ENGLISH_SOUTH_AFRICA       Language = 0x0A
+	Language_ENGLISH_TRINIDAD           Language = 0x0B
+	Language_ENGLISH_UK                 Language = 0x0C
+	Language_ENGLISH_USA                Language = 0x0D
+	Language_ENGLISH_ZIMBABWE           Language = 0x0E
+	Language_AFRIKAANS                  Language = 0x40
+	Language_BASQUE                     Language = 0x41
+	Language_CATALAN                    Language = 0x42
+	Language_DANISH                     Language = 0x43
+	Language_DUTCH_BELGIUM              Language = 0x44
+	Language_DUTCH_NETHERLANDS          Language = 0x45
+	Language_FAEROESE                   Language = 0x46
+	Language_FINNISH                    Language = 0x47
+	Language_FRENCH_BELGIUM             Language = 0x48
+	Language_FRENCH_CANADA              Language = 0x49
+	Language_FRENCH                     Language = 0x4A
+	Language_FRENCH_LUXEMBOURG          Language = 0x4B
+	Language_FRENCH_MONACO              Language = 0x4C
+	Language_FRENCH_SWITZERLAND         Language = 0x4D
+	Language_GALICIAN                   Language = 0x4E
+	Language_GERMAN_AUSTRIA             Language = 0x4F
+	Language_GERMAN                     Language = 0x50
+	Language_GERMAN_LIECHTENSTEIN       Language = 0x51
+	Language_GERMAN_LUXEMBOURG          Language = 0x52
+	Language_GERMAN_SWITZERLAND         Language = 0x53
+	Language_ICELANDIC                  Language = 0x54
+	Language_INDONESIAN                 Language = 0x55
+	Language_ITALIAN                    Language = 0x56
+	Language_ITALIAN_SWITZERLAND        Language = 0x57
+	Language_MALAY_BRUNEI               Language = 0x58
+	Language_MALAY                      Language = 0x59
+	Language_NORWEGIAN                  Language = 0x5A
+	Language_NORWEGIAN_NYNORSK          Language = 0x5B
+	Language_PORTUGUESE_BRAZIL          Language = 0x5C
+	Language_PORTUGUESE                 Language = 0x5D
+	Language_SPANISH_ARGENTINE          Language = 0x5E
+	Language_SPANISH_BOLIVIA            Language = 0x5F
+	Language_SPANISH_CHILE              Language = 0x60
+	Language_SPANISH_COLOMBIA           Language = 0x61
+	Language_SPANISH_COSTA_RICA         Language = 0x62
+	Language_SPANISH_DOMINICAN_REPUBLIC Language = 0x63
+	Language_SPANISH_ECUADOR            Language = 0x64
+	Language_SPANISH_EL_SALVADOR        Language = 0x65
+	Language_SPANISH_GUATEMALA          Language = 0x66
+	Language_SPANISH_HONDURAS           Language = 0x67
+	Language_SPANISH                    Language = 0x68
+	Language_SPANISH_MEXICO             Language = 0x69
+	Language_SPANISH_NICARAGUA          Language = 0x6A
+	Language_SPANISH_PANAMA             Language = 0x6B
+	Language_SPANISH_PARAGUAY           Language = 0x6C
+	Language_SPANISH_PERU               Language = 0x6D
+	Language_SPANISH_PERTO_RICO         Language = 0x6E
+	Language_SPANISH_TRADITIONAL        Language = 0x6F
+	Language_SPANISH_URUGUAY            Language = 0x70
+	Language_SPANISH_VENEZUELA          Language = 0x71
+	Language_SWAHILI                    Language = 0x72
+	Language_SWEDISH                    Language = 0x73
+	Language_SWEDISH_FINLAND            Language = 0x74
+	Language_CHINESE_CP936              Language = 0xCA
+)
+
+var LanguageValues []Language
+
+func init() {
+	_ = errors.New
+	LanguageValues = []Language{
+		Language_NO_LANGUAGE,
+		Language_ENGLISH,
+		Language_ENGLISH_AUSTRALIA,
+		Language_ENGLISH_BELIZE,
+		Language_ENGLISH_CANADA,
+		Language_ENGLISH_CARRIBEAN,
+		Language_ENGLISH_IRELAND,
+		Language_ENGLISH_JAMAICA,
+		Language_ENGLISH_NEW_ZEALAND,
+		Language_ENGLISH_PHILIPPINES,
+		Language_ENGLISH_SOUTH_AFRICA,
+		Language_ENGLISH_TRINIDAD,
+		Language_ENGLISH_UK,
+		Language_ENGLISH_USA,
+		Language_ENGLISH_ZIMBABWE,
+		Language_AFRIKAANS,
+		Language_BASQUE,
+		Language_CATALAN,
+		Language_DANISH,
+		Language_DUTCH_BELGIUM,
+		Language_DUTCH_NETHERLANDS,
+		Language_FAEROESE,
+		Language_FINNISH,
+		Language_FRENCH_BELGIUM,
+		Language_FRENCH_CANADA,
+		Language_FRENCH,
+		Language_FRENCH_LUXEMBOURG,
+		Language_FRENCH_MONACO,
+		Language_FRENCH_SWITZERLAND,
+		Language_GALICIAN,
+		Language_GERMAN_AUSTRIA,
+		Language_GERMAN,
+		Language_GERMAN_LIECHTENSTEIN,
+		Language_GERMAN_LUXEMBOURG,
+		Language_GERMAN_SWITZERLAND,
+		Language_ICELANDIC,
+		Language_INDONESIAN,
+		Language_ITALIAN,
+		Language_ITALIAN_SWITZERLAND,
+		Language_MALAY_BRUNEI,
+		Language_MALAY,
+		Language_NORWEGIAN,
+		Language_NORWEGIAN_NYNORSK,
+		Language_PORTUGUESE_BRAZIL,
+		Language_PORTUGUESE,
+		Language_SPANISH_ARGENTINE,
+		Language_SPANISH_BOLIVIA,
+		Language_SPANISH_CHILE,
+		Language_SPANISH_COLOMBIA,
+		Language_SPANISH_COSTA_RICA,
+		Language_SPANISH_DOMINICAN_REPUBLIC,
+		Language_SPANISH_ECUADOR,
+		Language_SPANISH_EL_SALVADOR,
+		Language_SPANISH_GUATEMALA,
+		Language_SPANISH_HONDURAS,
+		Language_SPANISH,
+		Language_SPANISH_MEXICO,
+		Language_SPANISH_NICARAGUA,
+		Language_SPANISH_PANAMA,
+		Language_SPANISH_PARAGUAY,
+		Language_SPANISH_PERU,
+		Language_SPANISH_PERTO_RICO,
+		Language_SPANISH_TRADITIONAL,
+		Language_SPANISH_URUGUAY,
+		Language_SPANISH_VENEZUELA,
+		Language_SWAHILI,
+		Language_SWEDISH,
+		Language_SWEDISH_FINLAND,
+		Language_CHINESE_CP936,
+	}
+}
+
+func LanguageByValue(value uint8) (enum Language, ok bool) {
+	switch value {
+	case 0x00:
+		return Language_NO_LANGUAGE, true
+	case 0x01:
+		return Language_ENGLISH, true
+	case 0x02:
+		return Language_ENGLISH_AUSTRALIA, true
+	case 0x03:
+		return Language_ENGLISH_BELIZE, true
+	case 0x04:
+		return Language_ENGLISH_CANADA, true
+	case 0x05:
+		return Language_ENGLISH_CARRIBEAN, true
+	case 0x06:
+		return Language_ENGLISH_IRELAND, true
+	case 0x07:
+		return Language_ENGLISH_JAMAICA, true
+	case 0x08:
+		return Language_ENGLISH_NEW_ZEALAND, true
+	case 0x09:
+		return Language_ENGLISH_PHILIPPINES, true
+	case 0x0A:
+		return Language_ENGLISH_SOUTH_AFRICA, true
+	case 0x0B:
+		return Language_ENGLISH_TRINIDAD, true
+	case 0x0C:
+		return Language_ENGLISH_UK, true
+	case 0x0D:
+		return Language_ENGLISH_USA, true
+	case 0x0E:
+		return Language_ENGLISH_ZIMBABWE, true
+	case 0x40:
+		return Language_AFRIKAANS, true
+	case 0x41:
+		return Language_BASQUE, true
+	case 0x42:
+		return Language_CATALAN, true
+	case 0x43:
+		return Language_DANISH, true
+	case 0x44:
+		return Language_DUTCH_BELGIUM, true
+	case 0x45:
+		return Language_DUTCH_NETHERLANDS, true
+	case 0x46:
+		return Language_FAEROESE, true
+	case 0x47:
+		return Language_FINNISH, true
+	case 0x48:
+		return Language_FRENCH_BELGIUM, true
+	case 0x49:
+		return Language_FRENCH_CANADA, true
+	case 0x4A:
+		return Language_FRENCH, true
+	case 0x4B:
+		return Language_FRENCH_LUXEMBOURG, true
+	case 0x4C:
+		return Language_FRENCH_MONACO, true
+	case 0x4D:
+		return Language_FRENCH_SWITZERLAND, true
+	case 0x4E:
+		return Language_GALICIAN, true
+	case 0x4F:
+		return Language_GERMAN_AUSTRIA, true
+	case 0x50:
+		return Language_GERMAN, true
+	case 0x51:
+		return Language_GERMAN_LIECHTENSTEIN, true
+	case 0x52:
+		return Language_GERMAN_LUXEMBOURG, true
+	case 0x53:
+		return Language_GERMAN_SWITZERLAND, true
+	case 0x54:
+		return Language_ICELANDIC, true
+	case 0x55:
+		return Language_INDONESIAN, true
+	case 0x56:
+		return Language_ITALIAN, true
+	case 0x57:
+		return Language_ITALIAN_SWITZERLAND, true
+	case 0x58:
+		return Language_MALAY_BRUNEI, true
+	case 0x59:
+		return Language_MALAY, true
+	case 0x5A:
+		return Language_NORWEGIAN, true
+	case 0x5B:
+		return Language_NORWEGIAN_NYNORSK, true
+	case 0x5C:
+		return Language_PORTUGUESE_BRAZIL, true
+	case 0x5D:
+		return Language_PORTUGUESE, true
+	case 0x5E:
+		return Language_SPANISH_ARGENTINE, true
+	case 0x5F:
+		return Language_SPANISH_BOLIVIA, true
+	case 0x60:
+		return Language_SPANISH_CHILE, true
+	case 0x61:
+		return Language_SPANISH_COLOMBIA, true
+	case 0x62:
+		return Language_SPANISH_COSTA_RICA, true
+	case 0x63:
+		return Language_SPANISH_DOMINICAN_REPUBLIC, true
+	case 0x64:
+		return Language_SPANISH_ECUADOR, true
+	case 0x65:
+		return Language_SPANISH_EL_SALVADOR, true
+	case 0x66:
+		return Language_SPANISH_GUATEMALA, true
+	case 0x67:
+		return Language_SPANISH_HONDURAS, true
+	case 0x68:
+		return Language_SPANISH, true
+	case 0x69:
+		return Language_SPANISH_MEXICO, true
+	case 0x6A:
+		return Language_SPANISH_NICARAGUA, true
+	case 0x6B:
+		return Language_SPANISH_PANAMA, true
+	case 0x6C:
+		return Language_SPANISH_PARAGUAY, true
+	case 0x6D:
+		return Language_SPANISH_PERU, true
+	case 0x6E:
+		return Language_SPANISH_PERTO_RICO, true
+	case 0x6F:
+		return Language_SPANISH_TRADITIONAL, true
+	case 0x70:
+		return Language_SPANISH_URUGUAY, true
+	case 0x71:
+		return Language_SPANISH_VENEZUELA, true
+	case 0x72:
+		return Language_SWAHILI, true
+	case 0x73:
+		return Language_SWEDISH, true
+	case 0x74:
+		return Language_SWEDISH_FINLAND, true
+	case 0xCA:
+		return Language_CHINESE_CP936, true
+	}
+	return 0, false
+}
+
+func LanguageByName(value string) (enum Language, ok bool) {
+	switch value {
+	case "NO_LANGUAGE":
+		return Language_NO_LANGUAGE, true
+	case "ENGLISH":
+		return Language_ENGLISH, true
+	case "ENGLISH_AUSTRALIA":
+		return Language_ENGLISH_AUSTRALIA, true
+	case "ENGLISH_BELIZE":
+		return Language_ENGLISH_BELIZE, true
+	case "ENGLISH_CANADA":
+		return Language_ENGLISH_CANADA, true
+	case "ENGLISH_CARRIBEAN":
+		return Language_ENGLISH_CARRIBEAN, true
+	case "ENGLISH_IRELAND":
+		return Language_ENGLISH_IRELAND, true
+	case "ENGLISH_JAMAICA":
+		return Language_ENGLISH_JAMAICA, true
+	case "ENGLISH_NEW_ZEALAND":
+		return Language_ENGLISH_NEW_ZEALAND, true
+	case "ENGLISH_PHILIPPINES":
+		return Language_ENGLISH_PHILIPPINES, true
+	case "ENGLISH_SOUTH_AFRICA":
+		return Language_ENGLISH_SOUTH_AFRICA, true
+	case "ENGLISH_TRINIDAD":
+		return Language_ENGLISH_TRINIDAD, true
+	case "ENGLISH_UK":
+		return Language_ENGLISH_UK, true
+	case "ENGLISH_USA":
+		return Language_ENGLISH_USA, true
+	case "ENGLISH_ZIMBABWE":
+		return Language_ENGLISH_ZIMBABWE, true
+	case "AFRIKAANS":
+		return Language_AFRIKAANS, true
+	case "BASQUE":
+		return Language_BASQUE, true
+	case "CATALAN":
+		return Language_CATALAN, true
+	case "DANISH":
+		return Language_DANISH, true
+	case "DUTCH_BELGIUM":
+		return Language_DUTCH_BELGIUM, true
+	case "DUTCH_NETHERLANDS":
+		return Language_DUTCH_NETHERLANDS, true
+	case "FAEROESE":
+		return Language_FAEROESE, true
+	case "FINNISH":
+		return Language_FINNISH, true
+	case "FRENCH_BELGIUM":
+		return Language_FRENCH_BELGIUM, true
+	case "FRENCH_CANADA":
+		return Language_FRENCH_CANADA, true
+	case "FRENCH":
+		return Language_FRENCH, true
+	case "FRENCH_LUXEMBOURG":
+		return Language_FRENCH_LUXEMBOURG, true
+	case "FRENCH_MONACO":
+		return Language_FRENCH_MONACO, true
+	case "FRENCH_SWITZERLAND":
+		return Language_FRENCH_SWITZERLAND, true
+	case "GALICIAN":
+		return Language_GALICIAN, true
+	case "GERMAN_AUSTRIA":
+		return Language_GERMAN_AUSTRIA, true
+	case "GERMAN":
+		return Language_GERMAN, true
+	case "GERMAN_LIECHTENSTEIN":
+		return Language_GERMAN_LIECHTENSTEIN, true
+	case "GERMAN_LUXEMBOURG":
+		return Language_GERMAN_LUXEMBOURG, true
+	case "GERMAN_SWITZERLAND":
+		return Language_GERMAN_SWITZERLAND, true
+	case "ICELANDIC":
+		return Language_ICELANDIC, true
+	case "INDONESIAN":
+		return Language_INDONESIAN, true
+	case "ITALIAN":
+		return Language_ITALIAN, true
+	case "ITALIAN_SWITZERLAND":
+		return Language_ITALIAN_SWITZERLAND, true
+	case "MALAY_BRUNEI":
+		return Language_MALAY_BRUNEI, true
+	case "MALAY":
+		return Language_MALAY, true
+	case "NORWEGIAN":
+		return Language_NORWEGIAN, true
+	case "NORWEGIAN_NYNORSK":
+		return Language_NORWEGIAN_NYNORSK, true
+	case "PORTUGUESE_BRAZIL":
+		return Language_PORTUGUESE_BRAZIL, true
+	case "PORTUGUESE":
+		return Language_PORTUGUESE, true
+	case "SPANISH_ARGENTINE":
+		return Language_SPANISH_ARGENTINE, true
+	case "SPANISH_BOLIVIA":
+		return Language_SPANISH_BOLIVIA, true
+	case "SPANISH_CHILE":
+		return Language_SPANISH_CHILE, true
+	case "SPANISH_COLOMBIA":
+		return Language_SPANISH_COLOMBIA, true
+	case "SPANISH_COSTA_RICA":
+		return Language_SPANISH_COSTA_RICA, true
+	case "SPANISH_DOMINICAN_REPUBLIC":
+		return Language_SPANISH_DOMINICAN_REPUBLIC, true
+	case "SPANISH_ECUADOR":
+		return Language_SPANISH_ECUADOR, true
+	case "SPANISH_EL_SALVADOR":
+		return Language_SPANISH_EL_SALVADOR, true
+	case "SPANISH_GUATEMALA":
+		return Language_SPANISH_GUATEMALA, true
+	case "SPANISH_HONDURAS":
+		return Language_SPANISH_HONDURAS, true
+	case "SPANISH":
+		return Language_SPANISH, true
+	case "SPANISH_MEXICO":
+		return Language_SPANISH_MEXICO, true
+	case "SPANISH_NICARAGUA":
+		return Language_SPANISH_NICARAGUA, true
+	case "SPANISH_PANAMA":
+		return Language_SPANISH_PANAMA, true
+	case "SPANISH_PARAGUAY":
+		return Language_SPANISH_PARAGUAY, true
+	case "SPANISH_PERU":
+		return Language_SPANISH_PERU, true
+	case "SPANISH_PERTO_RICO":
+		return Language_SPANISH_PERTO_RICO, true
+	case "SPANISH_TRADITIONAL":
+		return Language_SPANISH_TRADITIONAL, true
+	case "SPANISH_URUGUAY":
+		return Language_SPANISH_URUGUAY, true
+	case "SPANISH_VENEZUELA":
+		return Language_SPANISH_VENEZUELA, true
+	case "SWAHILI":
+		return Language_SWAHILI, true
+	case "SWEDISH":
+		return Language_SWEDISH, true
+	case "SWEDISH_FINLAND":
+		return Language_SWEDISH_FINLAND, true
+	case "CHINESE_CP936":
+		return Language_CHINESE_CP936, true
+	}
+	return 0, false
+}
+
+func LanguageKnows(value uint8) bool {
+	for _, typeValue := range LanguageValues {
+		if uint8(typeValue) == value {
+			return true
+		}
+	}
+	return false
+}
+
+func CastLanguage(structType interface{}) Language {
+	castFunc := func(typ interface{}) Language {
+		if sLanguage, ok := typ.(Language); ok {
+			return sLanguage
+		}
+		return 0
+	}
+	return castFunc(structType)
+}
+
+func (m Language) GetLengthInBits() uint16 {
+	return 8
+}
+
+func (m Language) GetLengthInBytes() uint16 {
+	return m.GetLengthInBits() / 8
+}
+
+func LanguageParse(readBuffer utils.ReadBuffer) (Language, error) {
+	val, err := readBuffer.ReadUint8("Language", 8)
+	if err != nil {
+		return 0, errors.Wrap(err, "error reading Language")
+	}
+	if enum, ok := LanguageByValue(val); !ok {
+		log.Debug().Msgf("no value %x found for RequestType", val)
+		return Language(val), nil
+	} else {
+		return enum, nil
+	}
+}
+
+func (e Language) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteUint8("Language", 8, uint8(e), utils.WithAdditionalStringRepresentation(e.PLC4XEnumName()))
+}
+
+// PLC4XEnumName returns the name that is used in code to identify this enum
+func (e Language) PLC4XEnumName() string {
+	switch e {
+	case Language_NO_LANGUAGE:
+		return "NO_LANGUAGE"
+	case Language_ENGLISH:
+		return "ENGLISH"
+	case Language_ENGLISH_AUSTRALIA:
+		return "ENGLISH_AUSTRALIA"
+	case Language_ENGLISH_BELIZE:
+		return "ENGLISH_BELIZE"
+	case Language_ENGLISH_CANADA:
+		return "ENGLISH_CANADA"
+	case Language_ENGLISH_CARRIBEAN:
+		return "ENGLISH_CARRIBEAN"
+	case Language_ENGLISH_IRELAND:
+		return "ENGLISH_IRELAND"
+	case Language_ENGLISH_JAMAICA:
+		return "ENGLISH_JAMAICA"
+	case Language_ENGLISH_NEW_ZEALAND:
+		return "ENGLISH_NEW_ZEALAND"
+	case Language_ENGLISH_PHILIPPINES:
+		return "ENGLISH_PHILIPPINES"
+	case Language_ENGLISH_SOUTH_AFRICA:
+		return "ENGLISH_SOUTH_AFRICA"
+	case Language_ENGLISH_TRINIDAD:
+		return "ENGLISH_TRINIDAD"
+	case Language_ENGLISH_UK:
+		return "ENGLISH_UK"
+	case Language_ENGLISH_USA:
+		return "ENGLISH_USA"
+	case Language_ENGLISH_ZIMBABWE:
+		return "ENGLISH_ZIMBABWE"
+	case Language_AFRIKAANS:
+		return "AFRIKAANS"
+	case Language_BASQUE:
+		return "BASQUE"
+	case Language_CATALAN:
+		return "CATALAN"
+	case Language_DANISH:
+		return "DANISH"
+	case Language_DUTCH_BELGIUM:
+		return "DUTCH_BELGIUM"
+	case Language_DUTCH_NETHERLANDS:
+		return "DUTCH_NETHERLANDS"
+	case Language_FAEROESE:
+		return "FAEROESE"
+	case Language_FINNISH:
+		return "FINNISH"
+	case Language_FRENCH_BELGIUM:
+		return "FRENCH_BELGIUM"
+	case Language_FRENCH_CANADA:
+		return "FRENCH_CANADA"
+	case Language_FRENCH:
+		return "FRENCH"
+	case Language_FRENCH_LUXEMBOURG:
+		return "FRENCH_LUXEMBOURG"
+	case Language_FRENCH_MONACO:
+		return "FRENCH_MONACO"
+	case Language_FRENCH_SWITZERLAND:
+		return "FRENCH_SWITZERLAND"
+	case Language_GALICIAN:
+		return "GALICIAN"
+	case Language_GERMAN_AUSTRIA:
+		return "GERMAN_AUSTRIA"
+	case Language_GERMAN:
+		return "GERMAN"
+	case Language_GERMAN_LIECHTENSTEIN:
+		return "GERMAN_LIECHTENSTEIN"
+	case Language_GERMAN_LUXEMBOURG:
+		return "GERMAN_LUXEMBOURG"
+	case Language_GERMAN_SWITZERLAND:
+		return "GERMAN_SWITZERLAND"
+	case Language_ICELANDIC:
+		return "ICELANDIC"
+	case Language_INDONESIAN:
+		return "INDONESIAN"
+	case Language_ITALIAN:
+		return "ITALIAN"
+	case Language_ITALIAN_SWITZERLAND:
+		return "ITALIAN_SWITZERLAND"
+	case Language_MALAY_BRUNEI:
+		return "MALAY_BRUNEI"
+	case Language_MALAY:
+		return "MALAY"
+	case Language_NORWEGIAN:
+		return "NORWEGIAN"
+	case Language_NORWEGIAN_NYNORSK:
+		return "NORWEGIAN_NYNORSK"
+	case Language_PORTUGUESE_BRAZIL:
+		return "PORTUGUESE_BRAZIL"
+	case Language_PORTUGUESE:
+		return "PORTUGUESE"
+	case Language_SPANISH_ARGENTINE:
+		return "SPANISH_ARGENTINE"
+	case Language_SPANISH_BOLIVIA:
+		return "SPANISH_BOLIVIA"
+	case Language_SPANISH_CHILE:
+		return "SPANISH_CHILE"
+	case Language_SPANISH_COLOMBIA:
+		return "SPANISH_COLOMBIA"
+	case Language_SPANISH_COSTA_RICA:
+		return "SPANISH_COSTA_RICA"
+	case Language_SPANISH_DOMINICAN_REPUBLIC:
+		return "SPANISH_DOMINICAN_REPUBLIC"
+	case Language_SPANISH_ECUADOR:
+		return "SPANISH_ECUADOR"
+	case Language_SPANISH_EL_SALVADOR:
+		return "SPANISH_EL_SALVADOR"
+	case Language_SPANISH_GUATEMALA:
+		return "SPANISH_GUATEMALA"
+	case Language_SPANISH_HONDURAS:
+		return "SPANISH_HONDURAS"
+	case Language_SPANISH:
+		return "SPANISH"
+	case Language_SPANISH_MEXICO:
+		return "SPANISH_MEXICO"
+	case Language_SPANISH_NICARAGUA:
+		return "SPANISH_NICARAGUA"
+	case Language_SPANISH_PANAMA:
+		return "SPANISH_PANAMA"
+	case Language_SPANISH_PARAGUAY:
+		return "SPANISH_PARAGUAY"
+	case Language_SPANISH_PERU:
+		return "SPANISH_PERU"
+	case Language_SPANISH_PERTO_RICO:
+		return "SPANISH_PERTO_RICO"
+	case Language_SPANISH_TRADITIONAL:
+		return "SPANISH_TRADITIONAL"
+	case Language_SPANISH_URUGUAY:
+		return "SPANISH_URUGUAY"
+	case Language_SPANISH_VENEZUELA:
+		return "SPANISH_VENEZUELA"
+	case Language_SWAHILI:
+		return "SWAHILI"
+	case Language_SWEDISH:
+		return "SWEDISH"
+	case Language_SWEDISH_FINLAND:
+		return "SWEDISH_FINLAND"
+	case Language_CHINESE_CP936:
+		return "CHINESE_CP936"
+	}
+	return ""
+}
+
+func (e Language) String() string {
+	return e.PLC4XEnumName()
+}
diff --git a/plc4go/protocols/cbus/readwrite/model/LightingDataLabel.go b/plc4go/protocols/cbus/readwrite/model/LightingDataLabel.go
index ddd6e5463..019dda57a 100644
--- a/plc4go/protocols/cbus/readwrite/model/LightingDataLabel.go
+++ b/plc4go/protocols/cbus/readwrite/model/LightingDataLabel.go
@@ -36,7 +36,7 @@ type LightingDataLabel interface {
 	// GetLabelOptions returns LabelOptions (property field)
 	GetLabelOptions() LightingLabelOptions
 	// GetLanguage returns Language (property field)
-	GetLanguage() *LightingLanguage
+	GetLanguage() *Language
 	// GetData returns Data (property field)
 	GetData() []byte
 }
@@ -53,7 +53,7 @@ type _LightingDataLabel struct {
 	*_LightingData
 	Group        byte
 	LabelOptions LightingLabelOptions
-	Language     *LightingLanguage
+	Language     *Language
 	Data         []byte
 }
 
@@ -88,7 +88,7 @@ func (m *_LightingDataLabel) GetLabelOptions() LightingLabelOptions {
 	return m.LabelOptions
 }
 
-func (m *_LightingDataLabel) GetLanguage() *LightingLanguage {
+func (m *_LightingDataLabel) GetLanguage() *Language {
 	return m.Language
 }
 
@@ -102,7 +102,7 @@ func (m *_LightingDataLabel) GetData() []byte {
 ///////////////////////////////////////////////////////////
 
 // NewLightingDataLabel factory function for _LightingDataLabel
-func NewLightingDataLabel(group byte, labelOptions LightingLabelOptions, language *LightingLanguage, data []byte, commandTypeContainer LightingCommandTypeContainer) *_LightingDataLabel {
+func NewLightingDataLabel(group byte, labelOptions LightingLabelOptions, language *Language, data []byte, commandTypeContainer LightingCommandTypeContainer) *_LightingDataLabel {
 	_result := &_LightingDataLabel{
 		Group:         group,
 		LabelOptions:  labelOptions,
@@ -189,12 +189,12 @@ func LightingDataLabelParse(readBuffer utils.ReadBuffer, commandTypeContainer Li
 	}
 
 	// Optional Field (language) (Can be skipped, if a given expression evaluates to false)
-	var language *LightingLanguage = nil
+	var language *Language = nil
 	if bool((labelOptions.GetLabelType()) != (LightingLabelType_LOAD_DYNAMIC_ICON)) {
 		if pullErr := readBuffer.PullContext("language"); pullErr != nil {
 			return nil, errors.Wrap(pullErr, "Error pulling for language")
 		}
-		_val, _err := LightingLanguageParse(readBuffer)
+		_val, _err := LanguageParse(readBuffer)
 		if _err != nil {
 			return nil, errors.Wrap(_err, "Error parsing 'language' field of LightingDataLabel")
 		}
@@ -254,7 +254,7 @@ func (m *_LightingDataLabel) Serialize(writeBuffer utils.WriteBuffer) error {
 		}
 
 		// Optional Field (language) (Can be skipped, if the value is null)
-		var language *LightingLanguage = nil
+		var language *Language = nil
 		if m.GetLanguage() != nil {
 			if pushErr := writeBuffer.PushContext("language"); pushErr != nil {
 				return errors.Wrap(pushErr, "Error pushing for language")
diff --git a/plc4go/protocols/cbus/readwrite/model/LightingLabelFlavour.go b/plc4go/protocols/cbus/readwrite/model/LightingLabelFlavour.go
index c74c977f5..2c80aede8 100644
--- a/plc4go/protocols/cbus/readwrite/model/LightingLabelFlavour.go
+++ b/plc4go/protocols/cbus/readwrite/model/LightingLabelFlavour.go
@@ -35,10 +35,10 @@ type ILightingLabelFlavour interface {
 }
 
 const (
-	LightingLabelFlavour_FLAVOUR_1 LightingLabelFlavour = 0
-	LightingLabelFlavour_FLAVOUR_2 LightingLabelFlavour = 1
-	LightingLabelFlavour_FLAVOUR_3 LightingLabelFlavour = 2
-	LightingLabelFlavour_FLAVOUR_4 LightingLabelFlavour = 3
+	LightingLabelFlavour_FLAVOUR_0 LightingLabelFlavour = 0
+	LightingLabelFlavour_FLAVOUR_1 LightingLabelFlavour = 1
+	LightingLabelFlavour_FLAVOUR_2 LightingLabelFlavour = 2
+	LightingLabelFlavour_FLAVOUR_3 LightingLabelFlavour = 3
 )
 
 var LightingLabelFlavourValues []LightingLabelFlavour
@@ -46,37 +46,37 @@ var LightingLabelFlavourValues []LightingLabelFlavour
 func init() {
 	_ = errors.New
 	LightingLabelFlavourValues = []LightingLabelFlavour{
+		LightingLabelFlavour_FLAVOUR_0,
 		LightingLabelFlavour_FLAVOUR_1,
 		LightingLabelFlavour_FLAVOUR_2,
 		LightingLabelFlavour_FLAVOUR_3,
-		LightingLabelFlavour_FLAVOUR_4,
 	}
 }
 
 func LightingLabelFlavourByValue(value uint8) (enum LightingLabelFlavour, ok bool) {
 	switch value {
 	case 0:
-		return LightingLabelFlavour_FLAVOUR_1, true
+		return LightingLabelFlavour_FLAVOUR_0, true
 	case 1:
-		return LightingLabelFlavour_FLAVOUR_2, true
+		return LightingLabelFlavour_FLAVOUR_1, true
 	case 2:
-		return LightingLabelFlavour_FLAVOUR_3, true
+		return LightingLabelFlavour_FLAVOUR_2, true
 	case 3:
-		return LightingLabelFlavour_FLAVOUR_4, true
+		return LightingLabelFlavour_FLAVOUR_3, true
 	}
 	return 0, false
 }
 
 func LightingLabelFlavourByName(value string) (enum LightingLabelFlavour, ok bool) {
 	switch value {
+	case "FLAVOUR_0":
+		return LightingLabelFlavour_FLAVOUR_0, true
 	case "FLAVOUR_1":
 		return LightingLabelFlavour_FLAVOUR_1, true
 	case "FLAVOUR_2":
 		return LightingLabelFlavour_FLAVOUR_2, true
 	case "FLAVOUR_3":
 		return LightingLabelFlavour_FLAVOUR_3, true
-	case "FLAVOUR_4":
-		return LightingLabelFlavour_FLAVOUR_4, true
 	}
 	return 0, false
 }
@@ -128,14 +128,14 @@ func (e LightingLabelFlavour) Serialize(writeBuffer utils.WriteBuffer) error {
 // PLC4XEnumName returns the name that is used in code to identify this enum
 func (e LightingLabelFlavour) PLC4XEnumName() string {
 	switch e {
+	case LightingLabelFlavour_FLAVOUR_0:
+		return "FLAVOUR_0"
 	case LightingLabelFlavour_FLAVOUR_1:
 		return "FLAVOUR_1"
 	case LightingLabelFlavour_FLAVOUR_2:
 		return "FLAVOUR_2"
 	case LightingLabelFlavour_FLAVOUR_3:
 		return "FLAVOUR_3"
-	case LightingLabelFlavour_FLAVOUR_4:
-		return "FLAVOUR_4"
 	}
 	return ""
 }
diff --git a/plc4go/protocols/cbus/readwrite/model/LightingLabelOptions.go b/plc4go/protocols/cbus/readwrite/model/LightingLabelOptions.go
index 466ac9b85..ea52fcd46 100644
--- a/plc4go/protocols/cbus/readwrite/model/LightingLabelOptions.go
+++ b/plc4go/protocols/cbus/readwrite/model/LightingLabelOptions.go
@@ -35,8 +35,8 @@ type LightingLabelOptions interface {
 	GetReservedBit7() bool
 	// GetLabelFlavour returns LabelFlavour (property field)
 	GetLabelFlavour() LightingLabelFlavour
-	// GetReservedBit4 returns ReservedBit4 (property field)
-	GetReservedBit4() bool
+	// GetReservedBit3 returns ReservedBit3 (property field)
+	GetReservedBit3() bool
 	// GetLabelType returns LabelType (property field)
 	GetLabelType() LightingLabelType
 	// GetReservedBit0 returns ReservedBit0 (property field)
@@ -54,7 +54,7 @@ type LightingLabelOptionsExactly interface {
 type _LightingLabelOptions struct {
 	ReservedBit7 bool
 	LabelFlavour LightingLabelFlavour
-	ReservedBit4 bool
+	ReservedBit3 bool
 	LabelType    LightingLabelType
 	ReservedBit0 bool
 }
@@ -72,8 +72,8 @@ func (m *_LightingLabelOptions) GetLabelFlavour() LightingLabelFlavour {
 	return m.LabelFlavour
 }
 
-func (m *_LightingLabelOptions) GetReservedBit4() bool {
-	return m.ReservedBit4
+func (m *_LightingLabelOptions) GetReservedBit3() bool {
+	return m.ReservedBit3
 }
 
 func (m *_LightingLabelOptions) GetLabelType() LightingLabelType {
@@ -90,8 +90,8 @@ func (m *_LightingLabelOptions) GetReservedBit0() bool {
 ///////////////////////////////////////////////////////////
 
 // NewLightingLabelOptions factory function for _LightingLabelOptions
-func NewLightingLabelOptions(reservedBit7 bool, labelFlavour LightingLabelFlavour, reservedBit4 bool, labelType LightingLabelType, reservedBit0 bool) *_LightingLabelOptions {
-	return &_LightingLabelOptions{ReservedBit7: reservedBit7, LabelFlavour: labelFlavour, ReservedBit4: reservedBit4, LabelType: labelType, ReservedBit0: reservedBit0}
+func NewLightingLabelOptions(reservedBit7 bool, labelFlavour LightingLabelFlavour, reservedBit3 bool, labelType LightingLabelType, reservedBit0 bool) *_LightingLabelOptions {
+	return &_LightingLabelOptions{ReservedBit7: reservedBit7, LabelFlavour: labelFlavour, ReservedBit3: reservedBit3, LabelType: labelType, ReservedBit0: reservedBit0}
 }
 
 // Deprecated: use the interface for direct cast
@@ -125,7 +125,7 @@ func (m *_LightingLabelOptions) GetLengthInBitsConditional(lastItem bool) uint16
 	// Reserved Field (reserved)
 	lengthInBits += 1
 
-	// Simple field (reservedBit4)
+	// Simple field (reservedBit3)
 	lengthInBits += 1
 
 	// Simple field (labelType)
@@ -184,12 +184,12 @@ func LightingLabelOptionsParse(readBuffer utils.ReadBuffer) (LightingLabelOption
 		}
 	}
 
-	// Simple Field (reservedBit4)
-	_reservedBit4, _reservedBit4Err := readBuffer.ReadBit("reservedBit4")
-	if _reservedBit4Err != nil {
-		return nil, errors.Wrap(_reservedBit4Err, "Error parsing 'reservedBit4' field of LightingLabelOptions")
+	// Simple Field (reservedBit3)
+	_reservedBit3, _reservedBit3Err := readBuffer.ReadBit("reservedBit3")
+	if _reservedBit3Err != nil {
+		return nil, errors.Wrap(_reservedBit3Err, "Error parsing 'reservedBit3' field of LightingLabelOptions")
 	}
-	reservedBit4 := _reservedBit4
+	reservedBit3 := _reservedBit3
 
 	// Simple Field (labelType)
 	if pullErr := readBuffer.PullContext("labelType"); pullErr != nil {
@@ -216,7 +216,7 @@ func LightingLabelOptionsParse(readBuffer utils.ReadBuffer) (LightingLabelOption
 	}
 
 	// Create the instance
-	return NewLightingLabelOptions(reservedBit7, labelFlavour, reservedBit4, labelType, reservedBit0), nil
+	return NewLightingLabelOptions(reservedBit7, labelFlavour, reservedBit3, labelType, reservedBit0), nil
 }
 
 func (m *_LightingLabelOptions) Serialize(writeBuffer utils.WriteBuffer) error {
@@ -253,11 +253,11 @@ func (m *_LightingLabelOptions) Serialize(writeBuffer utils.WriteBuffer) error {
 		}
 	}
 
-	// Simple Field (reservedBit4)
-	reservedBit4 := bool(m.GetReservedBit4())
-	_reservedBit4Err := writeBuffer.WriteBit("reservedBit4", (reservedBit4))
-	if _reservedBit4Err != nil {
-		return errors.Wrap(_reservedBit4Err, "Error serializing 'reservedBit4' field")
+	// Simple Field (reservedBit3)
+	reservedBit3 := bool(m.GetReservedBit3())
+	_reservedBit3Err := writeBuffer.WriteBit("reservedBit3", (reservedBit3))
+	if _reservedBit3Err != nil {
+		return errors.Wrap(_reservedBit3Err, "Error serializing 'reservedBit3' field")
 	}
 
 	// Simple Field (labelType)
diff --git a/plc4go/protocols/cbus/readwrite/model/LightingLanguage.go b/plc4go/protocols/cbus/readwrite/model/LightingLanguage.go
deleted file mode 100644
index 30bed260c..000000000
--- a/plc4go/protocols/cbus/readwrite/model/LightingLanguage.go
+++ /dev/null
@@ -1,665 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package model
-
-import (
-	"github.com/apache/plc4x/plc4go/internal/spi/utils"
-	"github.com/pkg/errors"
-	"github.com/rs/zerolog/log"
-)
-
-// Code generated by code-generation. DO NOT EDIT.
-
-// LightingLanguage is an enum
-type LightingLanguage uint8
-
-type ILightingLanguage interface {
-	Serialize(writeBuffer utils.WriteBuffer) error
-}
-
-const (
-	LightingLanguage_NO_LANGUAGE                LightingLanguage = 0x00
-	LightingLanguage_ENGLISH                    LightingLanguage = 0x01
-	LightingLanguage_ENGLISH_AUSTRALIA          LightingLanguage = 0x02
-	LightingLanguage_ENGLISH_BELIZE             LightingLanguage = 0x03
-	LightingLanguage_ENGLISH_CANADA             LightingLanguage = 0x04
-	LightingLanguage_ENGLISH_CARRIBEAN          LightingLanguage = 0x05
-	LightingLanguage_ENGLISH_IRELAND            LightingLanguage = 0x06
-	LightingLanguage_ENGLISH_JAMAICA            LightingLanguage = 0x07
-	LightingLanguage_ENGLISH_NEW_ZEALAND        LightingLanguage = 0x08
-	LightingLanguage_ENGLISH_PHILIPPINES        LightingLanguage = 0x09
-	LightingLanguage_ENGLISH_SOUTH_AFRICA       LightingLanguage = 0x0A
-	LightingLanguage_ENGLISH_TRINIDAD           LightingLanguage = 0x0B
-	LightingLanguage_ENGLISH_UK                 LightingLanguage = 0x0C
-	LightingLanguage_ENGLISH_USA                LightingLanguage = 0x0D
-	LightingLanguage_ENGLISH_ZIMBABWE           LightingLanguage = 0x0E
-	LightingLanguage_AFRIKAANS                  LightingLanguage = 0x40
-	LightingLanguage_BASQUE                     LightingLanguage = 0x41
-	LightingLanguage_CATALAN                    LightingLanguage = 0x42
-	LightingLanguage_DANISH                     LightingLanguage = 0x43
-	LightingLanguage_DUTCH_BELGIUM              LightingLanguage = 0x44
-	LightingLanguage_DUTCH_NETHERLANDS          LightingLanguage = 0x45
-	LightingLanguage_FAEROESE                   LightingLanguage = 0x46
-	LightingLanguage_FINNISH                    LightingLanguage = 0x47
-	LightingLanguage_FRENCH_BELGIUM             LightingLanguage = 0x48
-	LightingLanguage_FRENCH_CANADA              LightingLanguage = 0x49
-	LightingLanguage_FRENCH                     LightingLanguage = 0x4A
-	LightingLanguage_FRENCH_LUXEMBOURG          LightingLanguage = 0x4B
-	LightingLanguage_FRENCH_MONACO              LightingLanguage = 0x4C
-	LightingLanguage_FRENCH_SWITZERLAND         LightingLanguage = 0x4D
-	LightingLanguage_GALICIAN                   LightingLanguage = 0x4E
-	LightingLanguage_GERMAN_AUSTRIA             LightingLanguage = 0x4F
-	LightingLanguage_GERMAN                     LightingLanguage = 0x50
-	LightingLanguage_GERMAN_LIECHTENSTEIN       LightingLanguage = 0x51
-	LightingLanguage_GERMAN_LUXEMBOURG          LightingLanguage = 0x52
-	LightingLanguage_GERMAN_SWITZERLAND         LightingLanguage = 0x53
-	LightingLanguage_ICELANDIC                  LightingLanguage = 0x54
-	LightingLanguage_INDONESIAN                 LightingLanguage = 0x55
-	LightingLanguage_ITALIAN                    LightingLanguage = 0x56
-	LightingLanguage_ITALIAN_SWITZERLAND        LightingLanguage = 0x57
-	LightingLanguage_MALAY_BRUNEI               LightingLanguage = 0x58
-	LightingLanguage_MALAY                      LightingLanguage = 0x59
-	LightingLanguage_NORWEGIAN                  LightingLanguage = 0x5A
-	LightingLanguage_NORWEGIAN_NYNORSK          LightingLanguage = 0x5B
-	LightingLanguage_PORTUGUESE_BRAZIL          LightingLanguage = 0x5C
-	LightingLanguage_PORTUGUESE                 LightingLanguage = 0x5D
-	LightingLanguage_SPANISH_ARGENTINE          LightingLanguage = 0x5E
-	LightingLanguage_SPANISH_BOLIVIA            LightingLanguage = 0x5F
-	LightingLanguage_SPANISH_CHILE              LightingLanguage = 0x60
-	LightingLanguage_SPANISH_COLOMBIA           LightingLanguage = 0x61
-	LightingLanguage_SPANISH_COSTA_RICA         LightingLanguage = 0x62
-	LightingLanguage_SPANISH_DOMINICAN_REPUBLIC LightingLanguage = 0x63
-	LightingLanguage_SPANISH_ECUADOR            LightingLanguage = 0x64
-	LightingLanguage_SPANISH_EL_SALVADOR        LightingLanguage = 0x65
-	LightingLanguage_SPANISH_GUATEMALA          LightingLanguage = 0x66
-	LightingLanguage_SPANISH_HONDURAS           LightingLanguage = 0x67
-	LightingLanguage_SPANISH                    LightingLanguage = 0x68
-	LightingLanguage_SPANISH_MEXICO             LightingLanguage = 0x69
-	LightingLanguage_SPANISH_NICARAGUA          LightingLanguage = 0x6A
-	LightingLanguage_SPANISH_PANAMA             LightingLanguage = 0x6B
-	LightingLanguage_SPANISH_PARAGUAY           LightingLanguage = 0x6C
-	LightingLanguage_SPANISH_PERU               LightingLanguage = 0x6D
-	LightingLanguage_SPANISH_PERTO_RICO         LightingLanguage = 0x6E
-	LightingLanguage_SPANISH_TRADITIONAL        LightingLanguage = 0x6F
-	LightingLanguage_SPANISH_URUGUAY            LightingLanguage = 0x70
-	LightingLanguage_SPANISH_VENEZUELA          LightingLanguage = 0x71
-	LightingLanguage_SWAHILI                    LightingLanguage = 0x72
-	LightingLanguage_SWEDISH                    LightingLanguage = 0x73
-	LightingLanguage_SWEDISH_FINLAND            LightingLanguage = 0x74
-	LightingLanguage_CHINESE_CP936              LightingLanguage = 0xCA
-)
-
-var LightingLanguageValues []LightingLanguage
-
-func init() {
-	_ = errors.New
-	LightingLanguageValues = []LightingLanguage{
-		LightingLanguage_NO_LANGUAGE,
-		LightingLanguage_ENGLISH,
-		LightingLanguage_ENGLISH_AUSTRALIA,
-		LightingLanguage_ENGLISH_BELIZE,
-		LightingLanguage_ENGLISH_CANADA,
-		LightingLanguage_ENGLISH_CARRIBEAN,
-		LightingLanguage_ENGLISH_IRELAND,
-		LightingLanguage_ENGLISH_JAMAICA,
-		LightingLanguage_ENGLISH_NEW_ZEALAND,
-		LightingLanguage_ENGLISH_PHILIPPINES,
-		LightingLanguage_ENGLISH_SOUTH_AFRICA,
-		LightingLanguage_ENGLISH_TRINIDAD,
-		LightingLanguage_ENGLISH_UK,
-		LightingLanguage_ENGLISH_USA,
-		LightingLanguage_ENGLISH_ZIMBABWE,
-		LightingLanguage_AFRIKAANS,
-		LightingLanguage_BASQUE,
-		LightingLanguage_CATALAN,
-		LightingLanguage_DANISH,
-		LightingLanguage_DUTCH_BELGIUM,
-		LightingLanguage_DUTCH_NETHERLANDS,
-		LightingLanguage_FAEROESE,
-		LightingLanguage_FINNISH,
-		LightingLanguage_FRENCH_BELGIUM,
-		LightingLanguage_FRENCH_CANADA,
-		LightingLanguage_FRENCH,
-		LightingLanguage_FRENCH_LUXEMBOURG,
-		LightingLanguage_FRENCH_MONACO,
-		LightingLanguage_FRENCH_SWITZERLAND,
-		LightingLanguage_GALICIAN,
-		LightingLanguage_GERMAN_AUSTRIA,
-		LightingLanguage_GERMAN,
-		LightingLanguage_GERMAN_LIECHTENSTEIN,
-		LightingLanguage_GERMAN_LUXEMBOURG,
-		LightingLanguage_GERMAN_SWITZERLAND,
-		LightingLanguage_ICELANDIC,
-		LightingLanguage_INDONESIAN,
-		LightingLanguage_ITALIAN,
-		LightingLanguage_ITALIAN_SWITZERLAND,
-		LightingLanguage_MALAY_BRUNEI,
-		LightingLanguage_MALAY,
-		LightingLanguage_NORWEGIAN,
-		LightingLanguage_NORWEGIAN_NYNORSK,
-		LightingLanguage_PORTUGUESE_BRAZIL,
-		LightingLanguage_PORTUGUESE,
-		LightingLanguage_SPANISH_ARGENTINE,
-		LightingLanguage_SPANISH_BOLIVIA,
-		LightingLanguage_SPANISH_CHILE,
-		LightingLanguage_SPANISH_COLOMBIA,
-		LightingLanguage_SPANISH_COSTA_RICA,
-		LightingLanguage_SPANISH_DOMINICAN_REPUBLIC,
-		LightingLanguage_SPANISH_ECUADOR,
-		LightingLanguage_SPANISH_EL_SALVADOR,
-		LightingLanguage_SPANISH_GUATEMALA,
-		LightingLanguage_SPANISH_HONDURAS,
-		LightingLanguage_SPANISH,
-		LightingLanguage_SPANISH_MEXICO,
-		LightingLanguage_SPANISH_NICARAGUA,
-		LightingLanguage_SPANISH_PANAMA,
-		LightingLanguage_SPANISH_PARAGUAY,
-		LightingLanguage_SPANISH_PERU,
-		LightingLanguage_SPANISH_PERTO_RICO,
-		LightingLanguage_SPANISH_TRADITIONAL,
-		LightingLanguage_SPANISH_URUGUAY,
-		LightingLanguage_SPANISH_VENEZUELA,
-		LightingLanguage_SWAHILI,
-		LightingLanguage_SWEDISH,
-		LightingLanguage_SWEDISH_FINLAND,
-		LightingLanguage_CHINESE_CP936,
-	}
-}
-
-func LightingLanguageByValue(value uint8) (enum LightingLanguage, ok bool) {
-	switch value {
-	case 0x00:
-		return LightingLanguage_NO_LANGUAGE, true
-	case 0x01:
-		return LightingLanguage_ENGLISH, true
-	case 0x02:
-		return LightingLanguage_ENGLISH_AUSTRALIA, true
-	case 0x03:
-		return LightingLanguage_ENGLISH_BELIZE, true
-	case 0x04:
-		return LightingLanguage_ENGLISH_CANADA, true
-	case 0x05:
-		return LightingLanguage_ENGLISH_CARRIBEAN, true
-	case 0x06:
-		return LightingLanguage_ENGLISH_IRELAND, true
-	case 0x07:
-		return LightingLanguage_ENGLISH_JAMAICA, true
-	case 0x08:
-		return LightingLanguage_ENGLISH_NEW_ZEALAND, true
-	case 0x09:
-		return LightingLanguage_ENGLISH_PHILIPPINES, true
-	case 0x0A:
-		return LightingLanguage_ENGLISH_SOUTH_AFRICA, true
-	case 0x0B:
-		return LightingLanguage_ENGLISH_TRINIDAD, true
-	case 0x0C:
-		return LightingLanguage_ENGLISH_UK, true
-	case 0x0D:
-		return LightingLanguage_ENGLISH_USA, true
-	case 0x0E:
-		return LightingLanguage_ENGLISH_ZIMBABWE, true
-	case 0x40:
-		return LightingLanguage_AFRIKAANS, true
-	case 0x41:
-		return LightingLanguage_BASQUE, true
-	case 0x42:
-		return LightingLanguage_CATALAN, true
-	case 0x43:
-		return LightingLanguage_DANISH, true
-	case 0x44:
-		return LightingLanguage_DUTCH_BELGIUM, true
-	case 0x45:
-		return LightingLanguage_DUTCH_NETHERLANDS, true
-	case 0x46:
-		return LightingLanguage_FAEROESE, true
-	case 0x47:
-		return LightingLanguage_FINNISH, true
-	case 0x48:
-		return LightingLanguage_FRENCH_BELGIUM, true
-	case 0x49:
-		return LightingLanguage_FRENCH_CANADA, true
-	case 0x4A:
-		return LightingLanguage_FRENCH, true
-	case 0x4B:
-		return LightingLanguage_FRENCH_LUXEMBOURG, true
-	case 0x4C:
-		return LightingLanguage_FRENCH_MONACO, true
-	case 0x4D:
-		return LightingLanguage_FRENCH_SWITZERLAND, true
-	case 0x4E:
-		return LightingLanguage_GALICIAN, true
-	case 0x4F:
-		return LightingLanguage_GERMAN_AUSTRIA, true
-	case 0x50:
-		return LightingLanguage_GERMAN, true
-	case 0x51:
-		return LightingLanguage_GERMAN_LIECHTENSTEIN, true
-	case 0x52:
-		return LightingLanguage_GERMAN_LUXEMBOURG, true
-	case 0x53:
-		return LightingLanguage_GERMAN_SWITZERLAND, true
-	case 0x54:
-		return LightingLanguage_ICELANDIC, true
-	case 0x55:
-		return LightingLanguage_INDONESIAN, true
-	case 0x56:
-		return LightingLanguage_ITALIAN, true
-	case 0x57:
-		return LightingLanguage_ITALIAN_SWITZERLAND, true
-	case 0x58:
-		return LightingLanguage_MALAY_BRUNEI, true
-	case 0x59:
-		return LightingLanguage_MALAY, true
-	case 0x5A:
-		return LightingLanguage_NORWEGIAN, true
-	case 0x5B:
-		return LightingLanguage_NORWEGIAN_NYNORSK, true
-	case 0x5C:
-		return LightingLanguage_PORTUGUESE_BRAZIL, true
-	case 0x5D:
-		return LightingLanguage_PORTUGUESE, true
-	case 0x5E:
-		return LightingLanguage_SPANISH_ARGENTINE, true
-	case 0x5F:
-		return LightingLanguage_SPANISH_BOLIVIA, true
-	case 0x60:
-		return LightingLanguage_SPANISH_CHILE, true
-	case 0x61:
-		return LightingLanguage_SPANISH_COLOMBIA, true
-	case 0x62:
-		return LightingLanguage_SPANISH_COSTA_RICA, true
-	case 0x63:
-		return LightingLanguage_SPANISH_DOMINICAN_REPUBLIC, true
-	case 0x64:
-		return LightingLanguage_SPANISH_ECUADOR, true
-	case 0x65:
-		return LightingLanguage_SPANISH_EL_SALVADOR, true
-	case 0x66:
-		return LightingLanguage_SPANISH_GUATEMALA, true
-	case 0x67:
-		return LightingLanguage_SPANISH_HONDURAS, true
-	case 0x68:
-		return LightingLanguage_SPANISH, true
-	case 0x69:
-		return LightingLanguage_SPANISH_MEXICO, true
-	case 0x6A:
-		return LightingLanguage_SPANISH_NICARAGUA, true
-	case 0x6B:
-		return LightingLanguage_SPANISH_PANAMA, true
-	case 0x6C:
-		return LightingLanguage_SPANISH_PARAGUAY, true
-	case 0x6D:
-		return LightingLanguage_SPANISH_PERU, true
-	case 0x6E:
-		return LightingLanguage_SPANISH_PERTO_RICO, true
-	case 0x6F:
-		return LightingLanguage_SPANISH_TRADITIONAL, true
-	case 0x70:
-		return LightingLanguage_SPANISH_URUGUAY, true
-	case 0x71:
-		return LightingLanguage_SPANISH_VENEZUELA, true
-	case 0x72:
-		return LightingLanguage_SWAHILI, true
-	case 0x73:
-		return LightingLanguage_SWEDISH, true
-	case 0x74:
-		return LightingLanguage_SWEDISH_FINLAND, true
-	case 0xCA:
-		return LightingLanguage_CHINESE_CP936, true
-	}
-	return 0, false
-}
-
-func LightingLanguageByName(value string) (enum LightingLanguage, ok bool) {
-	switch value {
-	case "NO_LANGUAGE":
-		return LightingLanguage_NO_LANGUAGE, true
-	case "ENGLISH":
-		return LightingLanguage_ENGLISH, true
-	case "ENGLISH_AUSTRALIA":
-		return LightingLanguage_ENGLISH_AUSTRALIA, true
-	case "ENGLISH_BELIZE":
-		return LightingLanguage_ENGLISH_BELIZE, true
-	case "ENGLISH_CANADA":
-		return LightingLanguage_ENGLISH_CANADA, true
-	case "ENGLISH_CARRIBEAN":
-		return LightingLanguage_ENGLISH_CARRIBEAN, true
-	case "ENGLISH_IRELAND":
-		return LightingLanguage_ENGLISH_IRELAND, true
-	case "ENGLISH_JAMAICA":
-		return LightingLanguage_ENGLISH_JAMAICA, true
-	case "ENGLISH_NEW_ZEALAND":
-		return LightingLanguage_ENGLISH_NEW_ZEALAND, true
-	case "ENGLISH_PHILIPPINES":
-		return LightingLanguage_ENGLISH_PHILIPPINES, true
-	case "ENGLISH_SOUTH_AFRICA":
-		return LightingLanguage_ENGLISH_SOUTH_AFRICA, true
-	case "ENGLISH_TRINIDAD":
-		return LightingLanguage_ENGLISH_TRINIDAD, true
-	case "ENGLISH_UK":
-		return LightingLanguage_ENGLISH_UK, true
-	case "ENGLISH_USA":
-		return LightingLanguage_ENGLISH_USA, true
-	case "ENGLISH_ZIMBABWE":
-		return LightingLanguage_ENGLISH_ZIMBABWE, true
-	case "AFRIKAANS":
-		return LightingLanguage_AFRIKAANS, true
-	case "BASQUE":
-		return LightingLanguage_BASQUE, true
-	case "CATALAN":
-		return LightingLanguage_CATALAN, true
-	case "DANISH":
-		return LightingLanguage_DANISH, true
-	case "DUTCH_BELGIUM":
-		return LightingLanguage_DUTCH_BELGIUM, true
-	case "DUTCH_NETHERLANDS":
-		return LightingLanguage_DUTCH_NETHERLANDS, true
-	case "FAEROESE":
-		return LightingLanguage_FAEROESE, true
-	case "FINNISH":
-		return LightingLanguage_FINNISH, true
-	case "FRENCH_BELGIUM":
-		return LightingLanguage_FRENCH_BELGIUM, true
-	case "FRENCH_CANADA":
-		return LightingLanguage_FRENCH_CANADA, true
-	case "FRENCH":
-		return LightingLanguage_FRENCH, true
-	case "FRENCH_LUXEMBOURG":
-		return LightingLanguage_FRENCH_LUXEMBOURG, true
-	case "FRENCH_MONACO":
-		return LightingLanguage_FRENCH_MONACO, true
-	case "FRENCH_SWITZERLAND":
-		return LightingLanguage_FRENCH_SWITZERLAND, true
-	case "GALICIAN":
-		return LightingLanguage_GALICIAN, true
-	case "GERMAN_AUSTRIA":
-		return LightingLanguage_GERMAN_AUSTRIA, true
-	case "GERMAN":
-		return LightingLanguage_GERMAN, true
-	case "GERMAN_LIECHTENSTEIN":
-		return LightingLanguage_GERMAN_LIECHTENSTEIN, true
-	case "GERMAN_LUXEMBOURG":
-		return LightingLanguage_GERMAN_LUXEMBOURG, true
-	case "GERMAN_SWITZERLAND":
-		return LightingLanguage_GERMAN_SWITZERLAND, true
-	case "ICELANDIC":
-		return LightingLanguage_ICELANDIC, true
-	case "INDONESIAN":
-		return LightingLanguage_INDONESIAN, true
-	case "ITALIAN":
-		return LightingLanguage_ITALIAN, true
-	case "ITALIAN_SWITZERLAND":
-		return LightingLanguage_ITALIAN_SWITZERLAND, true
-	case "MALAY_BRUNEI":
-		return LightingLanguage_MALAY_BRUNEI, true
-	case "MALAY":
-		return LightingLanguage_MALAY, true
-	case "NORWEGIAN":
-		return LightingLanguage_NORWEGIAN, true
-	case "NORWEGIAN_NYNORSK":
-		return LightingLanguage_NORWEGIAN_NYNORSK, true
-	case "PORTUGUESE_BRAZIL":
-		return LightingLanguage_PORTUGUESE_BRAZIL, true
-	case "PORTUGUESE":
-		return LightingLanguage_PORTUGUESE, true
-	case "SPANISH_ARGENTINE":
-		return LightingLanguage_SPANISH_ARGENTINE, true
-	case "SPANISH_BOLIVIA":
-		return LightingLanguage_SPANISH_BOLIVIA, true
-	case "SPANISH_CHILE":
-		return LightingLanguage_SPANISH_CHILE, true
-	case "SPANISH_COLOMBIA":
-		return LightingLanguage_SPANISH_COLOMBIA, true
-	case "SPANISH_COSTA_RICA":
-		return LightingLanguage_SPANISH_COSTA_RICA, true
-	case "SPANISH_DOMINICAN_REPUBLIC":
-		return LightingLanguage_SPANISH_DOMINICAN_REPUBLIC, true
-	case "SPANISH_ECUADOR":
-		return LightingLanguage_SPANISH_ECUADOR, true
-	case "SPANISH_EL_SALVADOR":
-		return LightingLanguage_SPANISH_EL_SALVADOR, true
-	case "SPANISH_GUATEMALA":
-		return LightingLanguage_SPANISH_GUATEMALA, true
-	case "SPANISH_HONDURAS":
-		return LightingLanguage_SPANISH_HONDURAS, true
-	case "SPANISH":
-		return LightingLanguage_SPANISH, true
-	case "SPANISH_MEXICO":
-		return LightingLanguage_SPANISH_MEXICO, true
-	case "SPANISH_NICARAGUA":
-		return LightingLanguage_SPANISH_NICARAGUA, true
-	case "SPANISH_PANAMA":
-		return LightingLanguage_SPANISH_PANAMA, true
-	case "SPANISH_PARAGUAY":
-		return LightingLanguage_SPANISH_PARAGUAY, true
-	case "SPANISH_PERU":
-		return LightingLanguage_SPANISH_PERU, true
-	case "SPANISH_PERTO_RICO":
-		return LightingLanguage_SPANISH_PERTO_RICO, true
-	case "SPANISH_TRADITIONAL":
-		return LightingLanguage_SPANISH_TRADITIONAL, true
-	case "SPANISH_URUGUAY":
-		return LightingLanguage_SPANISH_URUGUAY, true
-	case "SPANISH_VENEZUELA":
-		return LightingLanguage_SPANISH_VENEZUELA, true
-	case "SWAHILI":
-		return LightingLanguage_SWAHILI, true
-	case "SWEDISH":
-		return LightingLanguage_SWEDISH, true
-	case "SWEDISH_FINLAND":
-		return LightingLanguage_SWEDISH_FINLAND, true
-	case "CHINESE_CP936":
-		return LightingLanguage_CHINESE_CP936, true
-	}
-	return 0, false
-}
-
-func LightingLanguageKnows(value uint8) bool {
-	for _, typeValue := range LightingLanguageValues {
-		if uint8(typeValue) == value {
-			return true
-		}
-	}
-	return false
-}
-
-func CastLightingLanguage(structType interface{}) LightingLanguage {
-	castFunc := func(typ interface{}) LightingLanguage {
-		if sLightingLanguage, ok := typ.(LightingLanguage); ok {
-			return sLightingLanguage
-		}
-		return 0
-	}
-	return castFunc(structType)
-}
-
-func (m LightingLanguage) GetLengthInBits() uint16 {
-	return 8
-}
-
-func (m LightingLanguage) GetLengthInBytes() uint16 {
-	return m.GetLengthInBits() / 8
-}
-
-func LightingLanguageParse(readBuffer utils.ReadBuffer) (LightingLanguage, error) {
-	val, err := readBuffer.ReadUint8("LightingLanguage", 8)
-	if err != nil {
-		return 0, errors.Wrap(err, "error reading LightingLanguage")
-	}
-	if enum, ok := LightingLanguageByValue(val); !ok {
-		log.Debug().Msgf("no value %x found for RequestType", val)
-		return LightingLanguage(val), nil
-	} else {
-		return enum, nil
-	}
-}
-
-func (e LightingLanguage) Serialize(writeBuffer utils.WriteBuffer) error {
-	return writeBuffer.WriteUint8("LightingLanguage", 8, uint8(e), utils.WithAdditionalStringRepresentation(e.PLC4XEnumName()))
-}
-
-// PLC4XEnumName returns the name that is used in code to identify this enum
-func (e LightingLanguage) PLC4XEnumName() string {
-	switch e {
-	case LightingLanguage_NO_LANGUAGE:
-		return "NO_LANGUAGE"
-	case LightingLanguage_ENGLISH:
-		return "ENGLISH"
-	case LightingLanguage_ENGLISH_AUSTRALIA:
-		return "ENGLISH_AUSTRALIA"
-	case LightingLanguage_ENGLISH_BELIZE:
-		return "ENGLISH_BELIZE"
-	case LightingLanguage_ENGLISH_CANADA:
-		return "ENGLISH_CANADA"
-	case LightingLanguage_ENGLISH_CARRIBEAN:
-		return "ENGLISH_CARRIBEAN"
-	case LightingLanguage_ENGLISH_IRELAND:
-		return "ENGLISH_IRELAND"
-	case LightingLanguage_ENGLISH_JAMAICA:
-		return "ENGLISH_JAMAICA"
-	case LightingLanguage_ENGLISH_NEW_ZEALAND:
-		return "ENGLISH_NEW_ZEALAND"
-	case LightingLanguage_ENGLISH_PHILIPPINES:
-		return "ENGLISH_PHILIPPINES"
-	case LightingLanguage_ENGLISH_SOUTH_AFRICA:
-		return "ENGLISH_SOUTH_AFRICA"
-	case LightingLanguage_ENGLISH_TRINIDAD:
-		return "ENGLISH_TRINIDAD"
-	case LightingLanguage_ENGLISH_UK:
-		return "ENGLISH_UK"
-	case LightingLanguage_ENGLISH_USA:
-		return "ENGLISH_USA"
-	case LightingLanguage_ENGLISH_ZIMBABWE:
-		return "ENGLISH_ZIMBABWE"
-	case LightingLanguage_AFRIKAANS:
-		return "AFRIKAANS"
-	case LightingLanguage_BASQUE:
-		return "BASQUE"
-	case LightingLanguage_CATALAN:
-		return "CATALAN"
-	case LightingLanguage_DANISH:
-		return "DANISH"
-	case LightingLanguage_DUTCH_BELGIUM:
-		return "DUTCH_BELGIUM"
-	case LightingLanguage_DUTCH_NETHERLANDS:
-		return "DUTCH_NETHERLANDS"
-	case LightingLanguage_FAEROESE:
-		return "FAEROESE"
-	case LightingLanguage_FINNISH:
-		return "FINNISH"
-	case LightingLanguage_FRENCH_BELGIUM:
-		return "FRENCH_BELGIUM"
-	case LightingLanguage_FRENCH_CANADA:
-		return "FRENCH_CANADA"
-	case LightingLanguage_FRENCH:
-		return "FRENCH"
-	case LightingLanguage_FRENCH_LUXEMBOURG:
-		return "FRENCH_LUXEMBOURG"
-	case LightingLanguage_FRENCH_MONACO:
-		return "FRENCH_MONACO"
-	case LightingLanguage_FRENCH_SWITZERLAND:
-		return "FRENCH_SWITZERLAND"
-	case LightingLanguage_GALICIAN:
-		return "GALICIAN"
-	case LightingLanguage_GERMAN_AUSTRIA:
-		return "GERMAN_AUSTRIA"
-	case LightingLanguage_GERMAN:
-		return "GERMAN"
-	case LightingLanguage_GERMAN_LIECHTENSTEIN:
-		return "GERMAN_LIECHTENSTEIN"
-	case LightingLanguage_GERMAN_LUXEMBOURG:
-		return "GERMAN_LUXEMBOURG"
-	case LightingLanguage_GERMAN_SWITZERLAND:
-		return "GERMAN_SWITZERLAND"
-	case LightingLanguage_ICELANDIC:
-		return "ICELANDIC"
-	case LightingLanguage_INDONESIAN:
-		return "INDONESIAN"
-	case LightingLanguage_ITALIAN:
-		return "ITALIAN"
-	case LightingLanguage_ITALIAN_SWITZERLAND:
-		return "ITALIAN_SWITZERLAND"
-	case LightingLanguage_MALAY_BRUNEI:
-		return "MALAY_BRUNEI"
-	case LightingLanguage_MALAY:
-		return "MALAY"
-	case LightingLanguage_NORWEGIAN:
-		return "NORWEGIAN"
-	case LightingLanguage_NORWEGIAN_NYNORSK:
-		return "NORWEGIAN_NYNORSK"
-	case LightingLanguage_PORTUGUESE_BRAZIL:
-		return "PORTUGUESE_BRAZIL"
-	case LightingLanguage_PORTUGUESE:
-		return "PORTUGUESE"
-	case LightingLanguage_SPANISH_ARGENTINE:
-		return "SPANISH_ARGENTINE"
-	case LightingLanguage_SPANISH_BOLIVIA:
-		return "SPANISH_BOLIVIA"
-	case LightingLanguage_SPANISH_CHILE:
-		return "SPANISH_CHILE"
-	case LightingLanguage_SPANISH_COLOMBIA:
-		return "SPANISH_COLOMBIA"
-	case LightingLanguage_SPANISH_COSTA_RICA:
-		return "SPANISH_COSTA_RICA"
-	case LightingLanguage_SPANISH_DOMINICAN_REPUBLIC:
-		return "SPANISH_DOMINICAN_REPUBLIC"
-	case LightingLanguage_SPANISH_ECUADOR:
-		return "SPANISH_ECUADOR"
-	case LightingLanguage_SPANISH_EL_SALVADOR:
-		return "SPANISH_EL_SALVADOR"
-	case LightingLanguage_SPANISH_GUATEMALA:
-		return "SPANISH_GUATEMALA"
-	case LightingLanguage_SPANISH_HONDURAS:
-		return "SPANISH_HONDURAS"
-	case LightingLanguage_SPANISH:
-		return "SPANISH"
-	case LightingLanguage_SPANISH_MEXICO:
-		return "SPANISH_MEXICO"
-	case LightingLanguage_SPANISH_NICARAGUA:
-		return "SPANISH_NICARAGUA"
-	case LightingLanguage_SPANISH_PANAMA:
-		return "SPANISH_PANAMA"
-	case LightingLanguage_SPANISH_PARAGUAY:
-		return "SPANISH_PARAGUAY"
-	case LightingLanguage_SPANISH_PERU:
-		return "SPANISH_PERU"
-	case LightingLanguage_SPANISH_PERTO_RICO:
-		return "SPANISH_PERTO_RICO"
-	case LightingLanguage_SPANISH_TRADITIONAL:
-		return "SPANISH_TRADITIONAL"
-	case LightingLanguage_SPANISH_URUGUAY:
-		return "SPANISH_URUGUAY"
-	case LightingLanguage_SPANISH_VENEZUELA:
-		return "SPANISH_VENEZUELA"
-	case LightingLanguage_SWAHILI:
-		return "SWAHILI"
-	case LightingLanguage_SWEDISH:
-		return "SWEDISH"
-	case LightingLanguage_SWEDISH_FINLAND:
-		return "SWEDISH_FINLAND"
-	case LightingLanguage_CHINESE_CP936:
-		return "CHINESE_CP936"
-	}
-	return ""
-}
-
-func (e LightingLanguage) String() string {
-	return e.PLC4XEnumName()
-}
diff --git a/plc4go/protocols/cbus/readwrite/model/SALDataTriggerControl.go b/plc4go/protocols/cbus/readwrite/model/SALDataTriggerControl.go
index ce1123fc0..16b3f7dae 100644
--- a/plc4go/protocols/cbus/readwrite/model/SALDataTriggerControl.go
+++ b/plc4go/protocols/cbus/readwrite/model/SALDataTriggerControl.go
@@ -31,6 +31,8 @@ type SALDataTriggerControl interface {
 	utils.LengthAware
 	utils.Serializable
 	SALData
+	// GetTriggerControlData returns TriggerControlData (property field)
+	GetTriggerControlData() TriggerControlData
 }
 
 // SALDataTriggerControlExactly can be used when we want exactly this type and not a type which fulfills SALDataTriggerControl.
@@ -43,6 +45,7 @@ type SALDataTriggerControlExactly interface {
 // _SALDataTriggerControl is the data-structure of this message
 type _SALDataTriggerControl struct {
 	*_SALData
+	TriggerControlData TriggerControlData
 }
 
 ///////////////////////////////////////////////////////////
@@ -67,10 +70,25 @@ func (m *_SALDataTriggerControl) GetParent() SALData {
 	return m._SALData
 }
 
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for property fields.
+///////////////////////
+
+func (m *_SALDataTriggerControl) GetTriggerControlData() TriggerControlData {
+	return m.TriggerControlData
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
 // NewSALDataTriggerControl factory function for _SALDataTriggerControl
-func NewSALDataTriggerControl(salData SALData) *_SALDataTriggerControl {
+func NewSALDataTriggerControl(triggerControlData TriggerControlData, salData SALData) *_SALDataTriggerControl {
 	_result := &_SALDataTriggerControl{
-		_SALData: NewSALData(salData),
+		TriggerControlData: triggerControlData,
+		_SALData:           NewSALData(salData),
 	}
 	_result._SALData._SALDataChildRequirements = _result
 	return _result
@@ -98,6 +116,9 @@ func (m *_SALDataTriggerControl) GetLengthInBits() uint16 {
 func (m *_SALDataTriggerControl) GetLengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(m.GetParentLengthInBits())
 
+	// Simple field (triggerControlData)
+	lengthInBits += m.TriggerControlData.GetLengthInBits()
+
 	return lengthInBits
 }
 
@@ -114,9 +135,17 @@ func SALDataTriggerControlParse(readBuffer utils.ReadBuffer, applicationId Appli
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Validation
-	if !(bool((1) == (2))) {
-		return nil, errors.WithStack(utils.ParseValidationError{"TRIGGER_CONTROL Not yet implemented"})
+	// Simple Field (triggerControlData)
+	if pullErr := readBuffer.PullContext("triggerControlData"); pullErr != nil {
+		return nil, errors.Wrap(pullErr, "Error pulling for triggerControlData")
+	}
+	_triggerControlData, _triggerControlDataErr := TriggerControlDataParse(readBuffer)
+	if _triggerControlDataErr != nil {
+		return nil, errors.Wrap(_triggerControlDataErr, "Error parsing 'triggerControlData' field of SALDataTriggerControl")
+	}
+	triggerControlData := _triggerControlData.(TriggerControlData)
+	if closeErr := readBuffer.CloseContext("triggerControlData"); closeErr != nil {
+		return nil, errors.Wrap(closeErr, "Error closing for triggerControlData")
 	}
 
 	if closeErr := readBuffer.CloseContext("SALDataTriggerControl"); closeErr != nil {
@@ -125,7 +154,8 @@ func SALDataTriggerControlParse(readBuffer utils.ReadBuffer, applicationId Appli
 
 	// Create a partially initialized instance
 	_child := &_SALDataTriggerControl{
-		_SALData: &_SALData{},
+		TriggerControlData: triggerControlData,
+		_SALData:           &_SALData{},
 	}
 	_child._SALData._SALDataChildRequirements = _child
 	return _child, nil
@@ -139,6 +169,18 @@ func (m *_SALDataTriggerControl) Serialize(writeBuffer utils.WriteBuffer) error
 			return errors.Wrap(pushErr, "Error pushing for SALDataTriggerControl")
 		}
 
+		// Simple Field (triggerControlData)
+		if pushErr := writeBuffer.PushContext("triggerControlData"); pushErr != nil {
+			return errors.Wrap(pushErr, "Error pushing for triggerControlData")
+		}
+		_triggerControlDataErr := writeBuffer.WriteSerializable(m.GetTriggerControlData())
+		if popErr := writeBuffer.PopContext("triggerControlData"); popErr != nil {
+			return errors.Wrap(popErr, "Error popping for triggerControlData")
+		}
+		if _triggerControlDataErr != nil {
+			return errors.Wrap(_triggerControlDataErr, "Error serializing 'triggerControlData' field")
+		}
+
 		if popErr := writeBuffer.PopContext("SALDataTriggerControl"); popErr != nil {
 			return errors.Wrap(popErr, "Error popping for SALDataTriggerControl")
 		}
diff --git a/plc4go/protocols/cbus/readwrite/model/StaticHelper.go b/plc4go/protocols/cbus/readwrite/model/StaticHelper.go
index 9b3d6c998..5282914d8 100644
--- a/plc4go/protocols/cbus/readwrite/model/StaticHelper.go
+++ b/plc4go/protocols/cbus/readwrite/model/StaticHelper.go
@@ -151,3 +151,13 @@ func KnowsMeteringCommandTypeContainer(readBuffer utils.ReadBuffer) bool {
 	}
 	return MeteringCommandTypeContainerKnows(readUint8)
 }
+
+func KnowsTriggerControlCommandTypeContainer(readBuffer utils.ReadBuffer) bool {
+	oldPos := readBuffer.GetPos()
+	defer readBuffer.Reset(oldPos)
+	readUint8, err := readBuffer.ReadUint8("", 8)
+	if err != nil {
+		return false
+	}
+	return TriggerControlCommandTypeContainerKnows(readUint8)
+}
diff --git a/plc4go/protocols/cbus/readwrite/model/TriggerControlCommandType.go b/plc4go/protocols/cbus/readwrite/model/TriggerControlCommandType.go
new file mode 100644
index 000000000..6f8dc558a
--- /dev/null
+++ b/plc4go/protocols/cbus/readwrite/model/TriggerControlCommandType.go
@@ -0,0 +1,153 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package model
+
+import (
+	"github.com/apache/plc4x/plc4go/internal/spi/utils"
+	"github.com/pkg/errors"
+	"github.com/rs/zerolog/log"
+)
+
+// Code generated by code-generation. DO NOT EDIT.
+
+// TriggerControlCommandType is an enum
+type TriggerControlCommandType uint8
+
+type ITriggerControlCommandType interface {
+	Serialize(writeBuffer utils.WriteBuffer) error
+}
+
+const (
+	TriggerControlCommandType_TRIGGER_EVENT  TriggerControlCommandType = 0x00
+	TriggerControlCommandType_TRIGGER_MIN    TriggerControlCommandType = 0x01
+	TriggerControlCommandType_TRIGGER_MAX    TriggerControlCommandType = 0x02
+	TriggerControlCommandType_INDICATOR_KILL TriggerControlCommandType = 0x03
+	TriggerControlCommandType_LABEL          TriggerControlCommandType = 0x04
+)
+
+var TriggerControlCommandTypeValues []TriggerControlCommandType
+
+func init() {
+	_ = errors.New
+	TriggerControlCommandTypeValues = []TriggerControlCommandType{
+		TriggerControlCommandType_TRIGGER_EVENT,
+		TriggerControlCommandType_TRIGGER_MIN,
+		TriggerControlCommandType_TRIGGER_MAX,
+		TriggerControlCommandType_INDICATOR_KILL,
+		TriggerControlCommandType_LABEL,
+	}
+}
+
+func TriggerControlCommandTypeByValue(value uint8) (enum TriggerControlCommandType, ok bool) {
+	switch value {
+	case 0x00:
+		return TriggerControlCommandType_TRIGGER_EVENT, true
+	case 0x01:
+		return TriggerControlCommandType_TRIGGER_MIN, true
+	case 0x02:
+		return TriggerControlCommandType_TRIGGER_MAX, true
+	case 0x03:
+		return TriggerControlCommandType_INDICATOR_KILL, true
+	case 0x04:
+		return TriggerControlCommandType_LABEL, true
+	}
+	return 0, false
+}
+
+func TriggerControlCommandTypeByName(value string) (enum TriggerControlCommandType, ok bool) {
+	switch value {
+	case "TRIGGER_EVENT":
+		return TriggerControlCommandType_TRIGGER_EVENT, true
+	case "TRIGGER_MIN":
+		return TriggerControlCommandType_TRIGGER_MIN, true
+	case "TRIGGER_MAX":
+		return TriggerControlCommandType_TRIGGER_MAX, true
+	case "INDICATOR_KILL":
+		return TriggerControlCommandType_INDICATOR_KILL, true
+	case "LABEL":
+		return TriggerControlCommandType_LABEL, true
+	}
+	return 0, false
+}
+
+func TriggerControlCommandTypeKnows(value uint8) bool {
+	for _, typeValue := range TriggerControlCommandTypeValues {
+		if uint8(typeValue) == value {
+			return true
+		}
+	}
+	return false
+}
+
+func CastTriggerControlCommandType(structType interface{}) TriggerControlCommandType {
+	castFunc := func(typ interface{}) TriggerControlCommandType {
+		if sTriggerControlCommandType, ok := typ.(TriggerControlCommandType); ok {
+			return sTriggerControlCommandType
+		}
+		return 0
+	}
+	return castFunc(structType)
+}
+
+func (m TriggerControlCommandType) GetLengthInBits() uint16 {
+	return 4
+}
+
+func (m TriggerControlCommandType) GetLengthInBytes() uint16 {
+	return m.GetLengthInBits() / 8
+}
+
+func TriggerControlCommandTypeParse(readBuffer utils.ReadBuffer) (TriggerControlCommandType, error) {
+	val, err := readBuffer.ReadUint8("TriggerControlCommandType", 4)
+	if err != nil {
+		return 0, errors.Wrap(err, "error reading TriggerControlCommandType")
+	}
+	if enum, ok := TriggerControlCommandTypeByValue(val); !ok {
+		log.Debug().Msgf("no value %x found for RequestType", val)
+		return TriggerControlCommandType(val), nil
+	} else {
+		return enum, nil
+	}
+}
+
+func (e TriggerControlCommandType) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteUint8("TriggerControlCommandType", 4, uint8(e), utils.WithAdditionalStringRepresentation(e.PLC4XEnumName()))
+}
+
+// PLC4XEnumName returns the name that is used in code to identify this enum
+func (e TriggerControlCommandType) PLC4XEnumName() string {
+	switch e {
+	case TriggerControlCommandType_TRIGGER_EVENT:
+		return "TRIGGER_EVENT"
+	case TriggerControlCommandType_TRIGGER_MIN:
+		return "TRIGGER_MIN"
+	case TriggerControlCommandType_TRIGGER_MAX:
+		return "TRIGGER_MAX"
+	case TriggerControlCommandType_INDICATOR_KILL:
+		return "INDICATOR_KILL"
+	case TriggerControlCommandType_LABEL:
+		return "LABEL"
+	}
+	return ""
+}
+
+func (e TriggerControlCommandType) String() string {
+	return e.PLC4XEnumName()
+}
diff --git a/plc4go/protocols/cbus/readwrite/model/TriggerControlCommandTypeContainer.go b/plc4go/protocols/cbus/readwrite/model/TriggerControlCommandTypeContainer.go
new file mode 100644
index 000000000..3c30baeb4
--- /dev/null
+++ b/plc4go/protocols/cbus/readwrite/model/TriggerControlCommandTypeContainer.go
@@ -0,0 +1,966 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package model
+
+import (
+	"github.com/apache/plc4x/plc4go/internal/spi/utils"
+	"github.com/pkg/errors"
+	"github.com/rs/zerolog/log"
+)
+
+// Code generated by code-generation. DO NOT EDIT.
+
+// TriggerControlCommandTypeContainer is an enum
+type TriggerControlCommandTypeContainer uint8
+
+type ITriggerControlCommandTypeContainer interface {
+	NumBytes() uint8
+	CommandType() TriggerControlCommandType
+	Serialize(writeBuffer utils.WriteBuffer) error
+}
+
+const (
+	TriggerControlCommandTypeContainer_TriggerControlCommandTriggerMin_1Bytes     TriggerControlCommandTypeContainer = 0x01
+	TriggerControlCommandTypeContainer_TriggerControlCommandIndicatorKill_1Bytes  TriggerControlCommandTypeContainer = 0x09
+	TriggerControlCommandTypeContainer_TriggerControlCommandTriggerMax_1Bytes     TriggerControlCommandTypeContainer = 0x79
+	TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent0_2Bytes  TriggerControlCommandTypeContainer = 0x02
+	TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent1_2Bytes  TriggerControlCommandTypeContainer = 0x0A
+	TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent2_2Bytes  TriggerControlCommandTypeContainer = 0x12
+	TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent3_2Bytes  TriggerControlCommandTypeContainer = 0x1A
+	TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent4_2Bytes  TriggerControlCommandTypeContainer = 0x22
+	TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent5_2Bytes  TriggerControlCommandTypeContainer = 0x2A
+	TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent6_2Bytes  TriggerControlCommandTypeContainer = 0x32
+	TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent7_2Bytes  TriggerControlCommandTypeContainer = 0x3A
+	TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent8_2Bytes  TriggerControlCommandTypeContainer = 0x42
+	TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent9_2Bytes  TriggerControlCommandTypeContainer = 0x4A
+	TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent10_2Bytes TriggerControlCommandTypeContainer = 0x52
+	TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent11_2Bytes TriggerControlCommandTypeContainer = 0x5A
+	TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent12_2Bytes TriggerControlCommandTypeContainer = 0x62
+	TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent13_2Bytes TriggerControlCommandTypeContainer = 0x6A
+	TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent14_2Bytes TriggerControlCommandTypeContainer = 0x72
+	TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent15_2Bytes TriggerControlCommandTypeContainer = 0x7A
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_0Bytes          TriggerControlCommandTypeContainer = 0xA0
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_1Bytes          TriggerControlCommandTypeContainer = 0xA1
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_2Bytes          TriggerControlCommandTypeContainer = 0xA2
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_3Bytes          TriggerControlCommandTypeContainer = 0xA3
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_4Bytes          TriggerControlCommandTypeContainer = 0xA4
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_5Bytes          TriggerControlCommandTypeContainer = 0xA5
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_6Bytes          TriggerControlCommandTypeContainer = 0xA6
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_7Bytes          TriggerControlCommandTypeContainer = 0xA7
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_8Bytes          TriggerControlCommandTypeContainer = 0xA8
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_9Bytes          TriggerControlCommandTypeContainer = 0xA9
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_10Bytes         TriggerControlCommandTypeContainer = 0xAA
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_11Bytes         TriggerControlCommandTypeContainer = 0xAB
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_12Bytes         TriggerControlCommandTypeContainer = 0xAC
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_13Bytes         TriggerControlCommandTypeContainer = 0xAD
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_14Bytes         TriggerControlCommandTypeContainer = 0xAE
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_15Bytes         TriggerControlCommandTypeContainer = 0xAF
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_16Bytes         TriggerControlCommandTypeContainer = 0xB0
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_17Bytes         TriggerControlCommandTypeContainer = 0xB1
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_18Bytes         TriggerControlCommandTypeContainer = 0xB2
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_19Bytes         TriggerControlCommandTypeContainer = 0xB3
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_20Bytes         TriggerControlCommandTypeContainer = 0xB4
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_21Bytes         TriggerControlCommandTypeContainer = 0xB5
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_22Bytes         TriggerControlCommandTypeContainer = 0xB6
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_23Bytes         TriggerControlCommandTypeContainer = 0xB7
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_24Bytes         TriggerControlCommandTypeContainer = 0xB8
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_25Bytes         TriggerControlCommandTypeContainer = 0xB9
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_26Bytes         TriggerControlCommandTypeContainer = 0xBA
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_27Bytes         TriggerControlCommandTypeContainer = 0xBB
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_28Bytes         TriggerControlCommandTypeContainer = 0xBC
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_29Bytes         TriggerControlCommandTypeContainer = 0xBD
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_30Bytes         TriggerControlCommandTypeContainer = 0xBE
+	TriggerControlCommandTypeContainer_TriggerControlCommandLabel_31Bytes         TriggerControlCommandTypeContainer = 0xBF
+)
+
+var TriggerControlCommandTypeContainerValues []TriggerControlCommandTypeContainer
+
+func init() {
+	_ = errors.New
+	TriggerControlCommandTypeContainerValues = []TriggerControlCommandTypeContainer{
+		TriggerControlCommandTypeContainer_TriggerControlCommandTriggerMin_1Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandIndicatorKill_1Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandTriggerMax_1Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent0_2Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent1_2Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent2_2Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent3_2Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent4_2Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent5_2Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent6_2Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent7_2Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent8_2Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent9_2Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent10_2Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent11_2Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent12_2Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent13_2Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent14_2Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent15_2Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_0Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_1Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_2Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_3Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_4Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_5Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_6Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_7Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_8Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_9Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_10Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_11Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_12Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_13Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_14Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_15Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_16Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_17Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_18Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_19Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_20Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_21Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_22Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_23Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_24Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_25Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_26Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_27Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_28Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_29Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_30Bytes,
+		TriggerControlCommandTypeContainer_TriggerControlCommandLabel_31Bytes,
+	}
+}
+
+func (e TriggerControlCommandTypeContainer) NumBytes() uint8 {
+	switch e {
+	case 0x01:
+		{ /* '0x01' */
+			return 1
+		}
+	case 0x02:
+		{ /* '0x02' */
+			return 2
+		}
+	case 0x09:
+		{ /* '0x09' */
+			return 1
+		}
+	case 0x0A:
+		{ /* '0x0A' */
+			return 2
+		}
+	case 0x12:
+		{ /* '0x12' */
+			return 2
+		}
+	case 0x1A:
+		{ /* '0x1A' */
+			return 2
+		}
+	case 0x22:
+		{ /* '0x22' */
+			return 2
+		}
+	case 0x2A:
+		{ /* '0x2A' */
+			return 2
+		}
+	case 0x32:
+		{ /* '0x32' */
+			return 2
+		}
+	case 0x3A:
+		{ /* '0x3A' */
+			return 2
+		}
+	case 0x42:
+		{ /* '0x42' */
+			return 2
+		}
+	case 0x4A:
+		{ /* '0x4A' */
+			return 2
+		}
+	case 0x52:
+		{ /* '0x52' */
+			return 2
+		}
+	case 0x5A:
+		{ /* '0x5A' */
+			return 2
+		}
+	case 0x62:
+		{ /* '0x62' */
+			return 2
+		}
+	case 0x6A:
+		{ /* '0x6A' */
+			return 2
+		}
+	case 0x72:
+		{ /* '0x72' */
+			return 2
+		}
+	case 0x79:
+		{ /* '0x79' */
+			return 1
+		}
+	case 0x7A:
+		{ /* '0x7A' */
+			return 2
+		}
+	case 0xA0:
+		{ /* '0xA0' */
+			return 0
+		}
+	case 0xA1:
+		{ /* '0xA1' */
+			return 1
+		}
+	case 0xA2:
+		{ /* '0xA2' */
+			return 2
+		}
+	case 0xA3:
+		{ /* '0xA3' */
+			return 3
+		}
+	case 0xA4:
+		{ /* '0xA4' */
+			return 4
+		}
+	case 0xA5:
+		{ /* '0xA5' */
+			return 5
+		}
+	case 0xA6:
+		{ /* '0xA6' */
+			return 6
+		}
+	case 0xA7:
+		{ /* '0xA7' */
+			return 7
+		}
+	case 0xA8:
+		{ /* '0xA8' */
+			return 8
+		}
+	case 0xA9:
+		{ /* '0xA9' */
+			return 9
+		}
+	case 0xAA:
+		{ /* '0xAA' */
+			return 10
+		}
+	case 0xAB:
+		{ /* '0xAB' */
+			return 11
+		}
+	case 0xAC:
+		{ /* '0xAC' */
+			return 12
+		}
+	case 0xAD:
+		{ /* '0xAD' */
+			return 13
+		}
+	case 0xAE:
+		{ /* '0xAE' */
+			return 14
+		}
+	case 0xAF:
+		{ /* '0xAF' */
+			return 15
+		}
+	case 0xB0:
+		{ /* '0xB0' */
+			return 16
+		}
+	case 0xB1:
+		{ /* '0xB1' */
+			return 17
+		}
+	case 0xB2:
+		{ /* '0xB2' */
+			return 18
+		}
+	case 0xB3:
+		{ /* '0xB3' */
+			return 19
+		}
+	case 0xB4:
+		{ /* '0xB4' */
+			return 20
+		}
+	case 0xB5:
+		{ /* '0xB5' */
+			return 21
+		}
+	case 0xB6:
+		{ /* '0xB6' */
+			return 22
+		}
+	case 0xB7:
+		{ /* '0xB7' */
+			return 23
+		}
+	case 0xB8:
+		{ /* '0xB8' */
+			return 24
+		}
+	case 0xB9:
+		{ /* '0xB9' */
+			return 25
+		}
+	case 0xBA:
+		{ /* '0xBA' */
+			return 26
+		}
+	case 0xBB:
+		{ /* '0xBB' */
+			return 27
+		}
+	case 0xBC:
+		{ /* '0xBC' */
+			return 28
+		}
+	case 0xBD:
+		{ /* '0xBD' */
+			return 29
+		}
+	case 0xBE:
+		{ /* '0xBE' */
+			return 30
+		}
+	case 0xBF:
+		{ /* '0xBF' */
+			return 31
+		}
+	default:
+		{
+			return 0
+		}
+	}
+}
+
+func TriggerControlCommandTypeContainerFirstEnumForFieldNumBytes(value uint8) (TriggerControlCommandTypeContainer, error) {
+	for _, sizeValue := range TriggerControlCommandTypeContainerValues {
+		if sizeValue.NumBytes() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v describing NumBytes not found", value)
+}
+
+func (e TriggerControlCommandTypeContainer) CommandType() TriggerControlCommandType {
+	switch e {
+	case 0x01:
+		{ /* '0x01' */
+			return TriggerControlCommandType_TRIGGER_MIN
+		}
+	case 0x02:
+		{ /* '0x02' */
+			return TriggerControlCommandType_TRIGGER_EVENT
+		}
+	case 0x09:
+		{ /* '0x09' */
+			return TriggerControlCommandType_INDICATOR_KILL
+		}
+	case 0x0A:
+		{ /* '0x0A' */
+			return TriggerControlCommandType_TRIGGER_EVENT
+		}
+	case 0x12:
+		{ /* '0x12' */
+			return TriggerControlCommandType_TRIGGER_EVENT
+		}
+	case 0x1A:
+		{ /* '0x1A' */
+			return TriggerControlCommandType_TRIGGER_EVENT
+		}
+	case 0x22:
+		{ /* '0x22' */
+			return TriggerControlCommandType_TRIGGER_EVENT
+		}
+	case 0x2A:
+		{ /* '0x2A' */
+			return TriggerControlCommandType_TRIGGER_EVENT
+		}
+	case 0x32:
+		{ /* '0x32' */
+			return TriggerControlCommandType_TRIGGER_EVENT
+		}
+	case 0x3A:
+		{ /* '0x3A' */
+			return TriggerControlCommandType_TRIGGER_EVENT
+		}
+	case 0x42:
+		{ /* '0x42' */
+			return TriggerControlCommandType_TRIGGER_EVENT
+		}
+	case 0x4A:
+		{ /* '0x4A' */
+			return TriggerControlCommandType_TRIGGER_EVENT
+		}
+	case 0x52:
+		{ /* '0x52' */
+			return TriggerControlCommandType_TRIGGER_EVENT
+		}
+	case 0x5A:
+		{ /* '0x5A' */
+			return TriggerControlCommandType_TRIGGER_EVENT
+		}
+	case 0x62:
+		{ /* '0x62' */
+			return TriggerControlCommandType_TRIGGER_EVENT
+		}
+	case 0x6A:
+		{ /* '0x6A' */
+			return TriggerControlCommandType_TRIGGER_EVENT
+		}
+	case 0x72:
+		{ /* '0x72' */
+			return TriggerControlCommandType_TRIGGER_EVENT
+		}
+	case 0x79:
+		{ /* '0x79' */
+			return TriggerControlCommandType_TRIGGER_MAX
+		}
+	case 0x7A:
+		{ /* '0x7A' */
+			return TriggerControlCommandType_TRIGGER_EVENT
+		}
+	case 0xA0:
+		{ /* '0xA0' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xA1:
+		{ /* '0xA1' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xA2:
+		{ /* '0xA2' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xA3:
+		{ /* '0xA3' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xA4:
+		{ /* '0xA4' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xA5:
+		{ /* '0xA5' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xA6:
+		{ /* '0xA6' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xA7:
+		{ /* '0xA7' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xA8:
+		{ /* '0xA8' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xA9:
+		{ /* '0xA9' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xAA:
+		{ /* '0xAA' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xAB:
+		{ /* '0xAB' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xAC:
+		{ /* '0xAC' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xAD:
+		{ /* '0xAD' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xAE:
+		{ /* '0xAE' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xAF:
+		{ /* '0xAF' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xB0:
+		{ /* '0xB0' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xB1:
+		{ /* '0xB1' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xB2:
+		{ /* '0xB2' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xB3:
+		{ /* '0xB3' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xB4:
+		{ /* '0xB4' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xB5:
+		{ /* '0xB5' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xB6:
+		{ /* '0xB6' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xB7:
+		{ /* '0xB7' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xB8:
+		{ /* '0xB8' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xB9:
+		{ /* '0xB9' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xBA:
+		{ /* '0xBA' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xBB:
+		{ /* '0xBB' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xBC:
+		{ /* '0xBC' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xBD:
+		{ /* '0xBD' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xBE:
+		{ /* '0xBE' */
+			return TriggerControlCommandType_LABEL
+		}
+	case 0xBF:
+		{ /* '0xBF' */
+			return TriggerControlCommandType_LABEL
+		}
+	default:
+		{
+			return 0
+		}
+	}
+}
+
+func TriggerControlCommandTypeContainerFirstEnumForFieldCommandType(value TriggerControlCommandType) (TriggerControlCommandTypeContainer, error) {
+	for _, sizeValue := range TriggerControlCommandTypeContainerValues {
+		if sizeValue.CommandType() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v describing CommandType not found", value)
+}
+func TriggerControlCommandTypeContainerByValue(value uint8) (enum TriggerControlCommandTypeContainer, ok bool) {
+	switch value {
+	case 0x01:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerMin_1Bytes, true
+	case 0x02:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent0_2Bytes, true
+	case 0x09:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandIndicatorKill_1Bytes, true
+	case 0x0A:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent1_2Bytes, true
+	case 0x12:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent2_2Bytes, true
+	case 0x1A:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent3_2Bytes, true
+	case 0x22:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent4_2Bytes, true
+	case 0x2A:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent5_2Bytes, true
+	case 0x32:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent6_2Bytes, true
+	case 0x3A:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent7_2Bytes, true
+	case 0x42:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent8_2Bytes, true
+	case 0x4A:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent9_2Bytes, true
+	case 0x52:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent10_2Bytes, true
+	case 0x5A:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent11_2Bytes, true
+	case 0x62:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent12_2Bytes, true
+	case 0x6A:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent13_2Bytes, true
+	case 0x72:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent14_2Bytes, true
+	case 0x79:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerMax_1Bytes, true
+	case 0x7A:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent15_2Bytes, true
+	case 0xA0:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_0Bytes, true
+	case 0xA1:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_1Bytes, true
+	case 0xA2:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_2Bytes, true
+	case 0xA3:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_3Bytes, true
+	case 0xA4:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_4Bytes, true
+	case 0xA5:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_5Bytes, true
+	case 0xA6:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_6Bytes, true
+	case 0xA7:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_7Bytes, true
+	case 0xA8:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_8Bytes, true
+	case 0xA9:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_9Bytes, true
+	case 0xAA:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_10Bytes, true
+	case 0xAB:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_11Bytes, true
+	case 0xAC:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_12Bytes, true
+	case 0xAD:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_13Bytes, true
+	case 0xAE:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_14Bytes, true
+	case 0xAF:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_15Bytes, true
+	case 0xB0:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_16Bytes, true
+	case 0xB1:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_17Bytes, true
+	case 0xB2:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_18Bytes, true
+	case 0xB3:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_19Bytes, true
+	case 0xB4:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_20Bytes, true
+	case 0xB5:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_21Bytes, true
+	case 0xB6:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_22Bytes, true
+	case 0xB7:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_23Bytes, true
+	case 0xB8:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_24Bytes, true
+	case 0xB9:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_25Bytes, true
+	case 0xBA:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_26Bytes, true
+	case 0xBB:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_27Bytes, true
+	case 0xBC:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_28Bytes, true
+	case 0xBD:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_29Bytes, true
+	case 0xBE:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_30Bytes, true
+	case 0xBF:
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_31Bytes, true
+	}
+	return 0, false
+}
+
+func TriggerControlCommandTypeContainerByName(value string) (enum TriggerControlCommandTypeContainer, ok bool) {
+	switch value {
+	case "TriggerControlCommandTriggerMin_1Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerMin_1Bytes, true
+	case "TriggerControlCommandTriggerEvent0_2Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent0_2Bytes, true
+	case "TriggerControlCommandIndicatorKill_1Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandIndicatorKill_1Bytes, true
+	case "TriggerControlCommandTriggerEvent1_2Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent1_2Bytes, true
+	case "TriggerControlCommandTriggerEvent2_2Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent2_2Bytes, true
+	case "TriggerControlCommandTriggerEvent3_2Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent3_2Bytes, true
+	case "TriggerControlCommandTriggerEvent4_2Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent4_2Bytes, true
+	case "TriggerControlCommandTriggerEvent5_2Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent5_2Bytes, true
+	case "TriggerControlCommandTriggerEvent6_2Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent6_2Bytes, true
+	case "TriggerControlCommandTriggerEvent7_2Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent7_2Bytes, true
+	case "TriggerControlCommandTriggerEvent8_2Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent8_2Bytes, true
+	case "TriggerControlCommandTriggerEvent9_2Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent9_2Bytes, true
+	case "TriggerControlCommandTriggerEvent10_2Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent10_2Bytes, true
+	case "TriggerControlCommandTriggerEvent11_2Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent11_2Bytes, true
+	case "TriggerControlCommandTriggerEvent12_2Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent12_2Bytes, true
+	case "TriggerControlCommandTriggerEvent13_2Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent13_2Bytes, true
+	case "TriggerControlCommandTriggerEvent14_2Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent14_2Bytes, true
+	case "TriggerControlCommandTriggerMax_1Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerMax_1Bytes, true
+	case "TriggerControlCommandTriggerEvent15_2Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent15_2Bytes, true
+	case "TriggerControlCommandLabel_0Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_0Bytes, true
+	case "TriggerControlCommandLabel_1Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_1Bytes, true
+	case "TriggerControlCommandLabel_2Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_2Bytes, true
+	case "TriggerControlCommandLabel_3Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_3Bytes, true
+	case "TriggerControlCommandLabel_4Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_4Bytes, true
+	case "TriggerControlCommandLabel_5Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_5Bytes, true
+	case "TriggerControlCommandLabel_6Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_6Bytes, true
+	case "TriggerControlCommandLabel_7Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_7Bytes, true
+	case "TriggerControlCommandLabel_8Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_8Bytes, true
+	case "TriggerControlCommandLabel_9Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_9Bytes, true
+	case "TriggerControlCommandLabel_10Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_10Bytes, true
+	case "TriggerControlCommandLabel_11Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_11Bytes, true
+	case "TriggerControlCommandLabel_12Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_12Bytes, true
+	case "TriggerControlCommandLabel_13Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_13Bytes, true
+	case "TriggerControlCommandLabel_14Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_14Bytes, true
+	case "TriggerControlCommandLabel_15Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_15Bytes, true
+	case "TriggerControlCommandLabel_16Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_16Bytes, true
+	case "TriggerControlCommandLabel_17Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_17Bytes, true
+	case "TriggerControlCommandLabel_18Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_18Bytes, true
+	case "TriggerControlCommandLabel_19Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_19Bytes, true
+	case "TriggerControlCommandLabel_20Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_20Bytes, true
+	case "TriggerControlCommandLabel_21Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_21Bytes, true
+	case "TriggerControlCommandLabel_22Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_22Bytes, true
+	case "TriggerControlCommandLabel_23Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_23Bytes, true
+	case "TriggerControlCommandLabel_24Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_24Bytes, true
+	case "TriggerControlCommandLabel_25Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_25Bytes, true
+	case "TriggerControlCommandLabel_26Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_26Bytes, true
+	case "TriggerControlCommandLabel_27Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_27Bytes, true
+	case "TriggerControlCommandLabel_28Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_28Bytes, true
+	case "TriggerControlCommandLabel_29Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_29Bytes, true
+	case "TriggerControlCommandLabel_30Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_30Bytes, true
+	case "TriggerControlCommandLabel_31Bytes":
+		return TriggerControlCommandTypeContainer_TriggerControlCommandLabel_31Bytes, true
+	}
+	return 0, false
+}
+
+func TriggerControlCommandTypeContainerKnows(value uint8) bool {
+	for _, typeValue := range TriggerControlCommandTypeContainerValues {
+		if uint8(typeValue) == value {
+			return true
+		}
+	}
+	return false
+}
+
+func CastTriggerControlCommandTypeContainer(structType interface{}) TriggerControlCommandTypeContainer {
+	castFunc := func(typ interface{}) TriggerControlCommandTypeContainer {
+		if sTriggerControlCommandTypeContainer, ok := typ.(TriggerControlCommandTypeContainer); ok {
+			return sTriggerControlCommandTypeContainer
+		}
+		return 0
+	}
+	return castFunc(structType)
+}
+
+func (m TriggerControlCommandTypeContainer) GetLengthInBits() uint16 {
+	return 8
+}
+
+func (m TriggerControlCommandTypeContainer) GetLengthInBytes() uint16 {
+	return m.GetLengthInBits() / 8
+}
+
+func TriggerControlCommandTypeContainerParse(readBuffer utils.ReadBuffer) (TriggerControlCommandTypeContainer, error) {
+	val, err := readBuffer.ReadUint8("TriggerControlCommandTypeContainer", 8)
+	if err != nil {
+		return 0, errors.Wrap(err, "error reading TriggerControlCommandTypeContainer")
+	}
+	if enum, ok := TriggerControlCommandTypeContainerByValue(val); !ok {
+		log.Debug().Msgf("no value %x found for RequestType", val)
+		return TriggerControlCommandTypeContainer(val), nil
+	} else {
+		return enum, nil
+	}
+}
+
+func (e TriggerControlCommandTypeContainer) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteUint8("TriggerControlCommandTypeContainer", 8, uint8(e), utils.WithAdditionalStringRepresentation(e.PLC4XEnumName()))
+}
+
+// PLC4XEnumName returns the name that is used in code to identify this enum
+func (e TriggerControlCommandTypeContainer) PLC4XEnumName() string {
+	switch e {
+	case TriggerControlCommandTypeContainer_TriggerControlCommandTriggerMin_1Bytes:
+		return "TriggerControlCommandTriggerMin_1Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent0_2Bytes:
+		return "TriggerControlCommandTriggerEvent0_2Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandIndicatorKill_1Bytes:
+		return "TriggerControlCommandIndicatorKill_1Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent1_2Bytes:
+		return "TriggerControlCommandTriggerEvent1_2Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent2_2Bytes:
+		return "TriggerControlCommandTriggerEvent2_2Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent3_2Bytes:
+		return "TriggerControlCommandTriggerEvent3_2Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent4_2Bytes:
+		return "TriggerControlCommandTriggerEvent4_2Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent5_2Bytes:
+		return "TriggerControlCommandTriggerEvent5_2Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent6_2Bytes:
+		return "TriggerControlCommandTriggerEvent6_2Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent7_2Bytes:
+		return "TriggerControlCommandTriggerEvent7_2Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent8_2Bytes:
+		return "TriggerControlCommandTriggerEvent8_2Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent9_2Bytes:
+		return "TriggerControlCommandTriggerEvent9_2Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent10_2Bytes:
+		return "TriggerControlCommandTriggerEvent10_2Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent11_2Bytes:
+		return "TriggerControlCommandTriggerEvent11_2Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent12_2Bytes:
+		return "TriggerControlCommandTriggerEvent12_2Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent13_2Bytes:
+		return "TriggerControlCommandTriggerEvent13_2Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent14_2Bytes:
+		return "TriggerControlCommandTriggerEvent14_2Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandTriggerMax_1Bytes:
+		return "TriggerControlCommandTriggerMax_1Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandTriggerEvent15_2Bytes:
+		return "TriggerControlCommandTriggerEvent15_2Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_0Bytes:
+		return "TriggerControlCommandLabel_0Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_1Bytes:
+		return "TriggerControlCommandLabel_1Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_2Bytes:
+		return "TriggerControlCommandLabel_2Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_3Bytes:
+		return "TriggerControlCommandLabel_3Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_4Bytes:
+		return "TriggerControlCommandLabel_4Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_5Bytes:
+		return "TriggerControlCommandLabel_5Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_6Bytes:
+		return "TriggerControlCommandLabel_6Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_7Bytes:
+		return "TriggerControlCommandLabel_7Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_8Bytes:
+		return "TriggerControlCommandLabel_8Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_9Bytes:
+		return "TriggerControlCommandLabel_9Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_10Bytes:
+		return "TriggerControlCommandLabel_10Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_11Bytes:
+		return "TriggerControlCommandLabel_11Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_12Bytes:
+		return "TriggerControlCommandLabel_12Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_13Bytes:
+		return "TriggerControlCommandLabel_13Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_14Bytes:
+		return "TriggerControlCommandLabel_14Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_15Bytes:
+		return "TriggerControlCommandLabel_15Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_16Bytes:
+		return "TriggerControlCommandLabel_16Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_17Bytes:
+		return "TriggerControlCommandLabel_17Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_18Bytes:
+		return "TriggerControlCommandLabel_18Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_19Bytes:
+		return "TriggerControlCommandLabel_19Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_20Bytes:
+		return "TriggerControlCommandLabel_20Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_21Bytes:
+		return "TriggerControlCommandLabel_21Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_22Bytes:
+		return "TriggerControlCommandLabel_22Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_23Bytes:
+		return "TriggerControlCommandLabel_23Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_24Bytes:
+		return "TriggerControlCommandLabel_24Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_25Bytes:
+		return "TriggerControlCommandLabel_25Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_26Bytes:
+		return "TriggerControlCommandLabel_26Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_27Bytes:
+		return "TriggerControlCommandLabel_27Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_28Bytes:
+		return "TriggerControlCommandLabel_28Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_29Bytes:
+		return "TriggerControlCommandLabel_29Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_30Bytes:
+		return "TriggerControlCommandLabel_30Bytes"
+	case TriggerControlCommandTypeContainer_TriggerControlCommandLabel_31Bytes:
+		return "TriggerControlCommandLabel_31Bytes"
+	}
+	return ""
+}
+
+func (e TriggerControlCommandTypeContainer) String() string {
+	return e.PLC4XEnumName()
+}
diff --git a/plc4go/protocols/cbus/readwrite/model/TriggerControlData.go b/plc4go/protocols/cbus/readwrite/model/TriggerControlData.go
new file mode 100644
index 000000000..ef5d40e63
--- /dev/null
+++ b/plc4go/protocols/cbus/readwrite/model/TriggerControlData.go
@@ -0,0 +1,294 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package model
+
+import (
+	"github.com/apache/plc4x/plc4go/internal/spi/utils"
+	"github.com/pkg/errors"
+)
+
+// Code generated by code-generation. DO NOT EDIT.
+
+// TriggerControlData is the corresponding interface of TriggerControlData
+type TriggerControlData interface {
+	utils.LengthAware
+	utils.Serializable
+	// GetCommandTypeContainer returns CommandTypeContainer (property field)
+	GetCommandTypeContainer() TriggerControlCommandTypeContainer
+	// GetTriggerGroup returns TriggerGroup (property field)
+	GetTriggerGroup() byte
+	// GetCommandType returns CommandType (virtual field)
+	GetCommandType() TriggerControlCommandType
+	// GetIsUnused returns IsUnused (virtual field)
+	GetIsUnused() bool
+}
+
+// TriggerControlDataExactly can be used when we want exactly this type and not a type which fulfills TriggerControlData.
+// This is useful for switch cases.
+type TriggerControlDataExactly interface {
+	TriggerControlData
+	isTriggerControlData() bool
+}
+
+// _TriggerControlData is the data-structure of this message
+type _TriggerControlData struct {
+	_TriggerControlDataChildRequirements
+	CommandTypeContainer TriggerControlCommandTypeContainer
+	TriggerGroup         byte
+}
+
+type _TriggerControlDataChildRequirements interface {
+	utils.Serializable
+	GetLengthInBits() uint16
+	GetLengthInBitsConditional(lastItem bool) uint16
+}
+
+type TriggerControlDataParent interface {
+	SerializeParent(writeBuffer utils.WriteBuffer, child TriggerControlData, serializeChildFunction func() error) error
+	GetTypeName() string
+}
+
+type TriggerControlDataChild interface {
+	utils.Serializable
+	InitializeParent(parent TriggerControlData, commandTypeContainer TriggerControlCommandTypeContainer, triggerGroup byte)
+	GetParent() *TriggerControlData
+
+	GetTypeName() string
+	TriggerControlData
+}
+
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for property fields.
+///////////////////////
+
+func (m *_TriggerControlData) GetCommandTypeContainer() TriggerControlCommandTypeContainer {
+	return m.CommandTypeContainer
+}
+
+func (m *_TriggerControlData) GetTriggerGroup() byte {
+	return m.TriggerGroup
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for virtual fields.
+///////////////////////
+
+func (m *_TriggerControlData) GetCommandType() TriggerControlCommandType {
+	return CastTriggerControlCommandType(m.GetCommandTypeContainer().CommandType())
+}
+
+func (m *_TriggerControlData) GetIsUnused() bool {
+	return bool(bool((m.GetTriggerGroup()) > (0xFE)))
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
+// NewTriggerControlData factory function for _TriggerControlData
+func NewTriggerControlData(commandTypeContainer TriggerControlCommandTypeContainer, triggerGroup byte) *_TriggerControlData {
+	return &_TriggerControlData{CommandTypeContainer: commandTypeContainer, TriggerGroup: triggerGroup}
+}
+
+// Deprecated: use the interface for direct cast
+func CastTriggerControlData(structType interface{}) TriggerControlData {
+	if casted, ok := structType.(TriggerControlData); ok {
+		return casted
+	}
+	if casted, ok := structType.(*TriggerControlData); ok {
+		return *casted
+	}
+	return nil
+}
+
+func (m *_TriggerControlData) GetTypeName() string {
+	return "TriggerControlData"
+}
+
+func (m *_TriggerControlData) GetParentLengthInBits() uint16 {
+	lengthInBits := uint16(0)
+
+	// Simple field (commandTypeContainer)
+	lengthInBits += 8
+
+	// A virtual field doesn't have any in- or output.
+
+	// Simple field (triggerGroup)
+	lengthInBits += 8
+
+	// A virtual field doesn't have any in- or output.
+
+	return lengthInBits
+}
+
+func (m *_TriggerControlData) GetLengthInBytes() uint16 {
+	return m.GetLengthInBits() / 8
+}
+
+func TriggerControlDataParse(readBuffer utils.ReadBuffer) (TriggerControlData, error) {
+	positionAware := readBuffer
+	_ = positionAware
+	if pullErr := readBuffer.PullContext("TriggerControlData"); pullErr != nil {
+		return nil, errors.Wrap(pullErr, "Error pulling for TriggerControlData")
+	}
+	currentPos := positionAware.GetPos()
+	_ = currentPos
+
+	// Validation
+	if !(KnowsTriggerControlCommandTypeContainer(readBuffer)) {
+		return nil, errors.WithStack(utils.ParseAssertError{"no command type could be found"})
+	}
+
+	// Simple Field (commandTypeContainer)
+	if pullErr := readBuffer.PullContext("commandTypeContainer"); pullErr != nil {
+		return nil, errors.Wrap(pullErr, "Error pulling for commandTypeContainer")
+	}
+	_commandTypeContainer, _commandTypeContainerErr := TriggerControlCommandTypeContainerParse(readBuffer)
+	if _commandTypeContainerErr != nil {
+		return nil, errors.Wrap(_commandTypeContainerErr, "Error parsing 'commandTypeContainer' field of TriggerControlData")
+	}
+	commandTypeContainer := _commandTypeContainer
+	if closeErr := readBuffer.CloseContext("commandTypeContainer"); closeErr != nil {
+		return nil, errors.Wrap(closeErr, "Error closing for commandTypeContainer")
+	}
+
+	// Virtual field
+	_commandType := commandTypeContainer.CommandType()
+	commandType := TriggerControlCommandType(_commandType)
+	_ = commandType
+
+	// Simple Field (triggerGroup)
+	_triggerGroup, _triggerGroupErr := readBuffer.ReadByte("triggerGroup")
+	if _triggerGroupErr != nil {
+		return nil, errors.Wrap(_triggerGroupErr, "Error parsing 'triggerGroup' field of TriggerControlData")
+	}
+	triggerGroup := _triggerGroup
+
+	// Virtual field
+	_isUnused := bool((triggerGroup) > (0xFE))
+	isUnused := bool(_isUnused)
+	_ = isUnused
+
+	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
+	type TriggerControlDataChildSerializeRequirement interface {
+		TriggerControlData
+		InitializeParent(TriggerControlData, TriggerControlCommandTypeContainer, byte)
+		GetParent() TriggerControlData
+	}
+	var _childTemp interface{}
+	var _child TriggerControlDataChildSerializeRequirement
+	var typeSwitchError error
+	switch {
+	case commandType == TriggerControlCommandType_TRIGGER_EVENT: // TriggerControlDataTriggerEvent
+		_childTemp, typeSwitchError = TriggerControlDataTriggerEventParse(readBuffer)
+	case commandType == TriggerControlCommandType_TRIGGER_MIN: // TriggerControlDataTriggerMin
+		_childTemp, typeSwitchError = TriggerControlDataTriggerMinParse(readBuffer)
+	case commandType == TriggerControlCommandType_TRIGGER_MAX: // TriggerControlDataTriggerMin
+		_childTemp, typeSwitchError = TriggerControlDataTriggerMinParse(readBuffer)
+	case commandType == TriggerControlCommandType_INDICATOR_KILL: // TriggerControlDataIndicatorKill
+		_childTemp, typeSwitchError = TriggerControlDataIndicatorKillParse(readBuffer)
+	case commandType == TriggerControlCommandType_LABEL: // TriggerControlDataLabel
+		_childTemp, typeSwitchError = TriggerControlDataLabelParse(readBuffer, commandTypeContainer)
+	default:
+		typeSwitchError = errors.Errorf("Unmapped type for parameters [commandType=%v]", commandType)
+	}
+	if typeSwitchError != nil {
+		return nil, errors.Wrap(typeSwitchError, "Error parsing sub-type for type-switch of TriggerControlData")
+	}
+	_child = _childTemp.(TriggerControlDataChildSerializeRequirement)
+
+	if closeErr := readBuffer.CloseContext("TriggerControlData"); closeErr != nil {
+		return nil, errors.Wrap(closeErr, "Error closing for TriggerControlData")
+	}
+
+	// Finish initializing
+	_child.InitializeParent(_child, commandTypeContainer, triggerGroup)
+	return _child, nil
+}
+
+func (pm *_TriggerControlData) SerializeParent(writeBuffer utils.WriteBuffer, child TriggerControlData, serializeChildFunction func() error) error {
+	// We redirect all calls through client as some methods are only implemented there
+	m := child
+	_ = m
+	positionAware := writeBuffer
+	_ = positionAware
+	if pushErr := writeBuffer.PushContext("TriggerControlData"); pushErr != nil {
+		return errors.Wrap(pushErr, "Error pushing for TriggerControlData")
+	}
+
+	// Simple Field (commandTypeContainer)
+	if pushErr := writeBuffer.PushContext("commandTypeContainer"); pushErr != nil {
+		return errors.Wrap(pushErr, "Error pushing for commandTypeContainer")
+	}
+	_commandTypeContainerErr := writeBuffer.WriteSerializable(m.GetCommandTypeContainer())
+	if popErr := writeBuffer.PopContext("commandTypeContainer"); popErr != nil {
+		return errors.Wrap(popErr, "Error popping for commandTypeContainer")
+	}
+	if _commandTypeContainerErr != nil {
+		return errors.Wrap(_commandTypeContainerErr, "Error serializing 'commandTypeContainer' field")
+	}
+	// Virtual field
+	if _commandTypeErr := writeBuffer.WriteVirtual("commandType", m.GetCommandType()); _commandTypeErr != nil {
+		return errors.Wrap(_commandTypeErr, "Error serializing 'commandType' field")
+	}
+
+	// Simple Field (triggerGroup)
+	triggerGroup := byte(m.GetTriggerGroup())
+	_triggerGroupErr := writeBuffer.WriteByte("triggerGroup", (triggerGroup))
+	if _triggerGroupErr != nil {
+		return errors.Wrap(_triggerGroupErr, "Error serializing 'triggerGroup' field")
+	}
+	// Virtual field
+	if _isUnusedErr := writeBuffer.WriteVirtual("isUnused", m.GetIsUnused()); _isUnusedErr != nil {
+		return errors.Wrap(_isUnusedErr, "Error serializing 'isUnused' field")
+	}
+
+	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
+	if _typeSwitchErr := serializeChildFunction(); _typeSwitchErr != nil {
+		return errors.Wrap(_typeSwitchErr, "Error serializing sub-type field")
+	}
+
+	if popErr := writeBuffer.PopContext("TriggerControlData"); popErr != nil {
+		return errors.Wrap(popErr, "Error popping for TriggerControlData")
+	}
+	return nil
+}
+
+func (m *_TriggerControlData) isTriggerControlData() bool {
+	return true
+}
+
+func (m *_TriggerControlData) String() string {
+	if m == nil {
+		return "<nil>"
+	}
+	writeBuffer := utils.NewBoxedWriteBufferWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(m); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
diff --git a/plc4go/protocols/cbus/readwrite/model/TriggerControlDataIndicatorKill.go b/plc4go/protocols/cbus/readwrite/model/TriggerControlDataIndicatorKill.go
new file mode 100644
index 000000000..c5369608d
--- /dev/null
+++ b/plc4go/protocols/cbus/readwrite/model/TriggerControlDataIndicatorKill.go
@@ -0,0 +1,155 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package model
+
+import (
+	"github.com/apache/plc4x/plc4go/internal/spi/utils"
+	"github.com/pkg/errors"
+)
+
+// Code generated by code-generation. DO NOT EDIT.
+
+// TriggerControlDataIndicatorKill is the corresponding interface of TriggerControlDataIndicatorKill
+type TriggerControlDataIndicatorKill interface {
+	utils.LengthAware
+	utils.Serializable
+	TriggerControlData
+}
+
+// TriggerControlDataIndicatorKillExactly can be used when we want exactly this type and not a type which fulfills TriggerControlDataIndicatorKill.
+// This is useful for switch cases.
+type TriggerControlDataIndicatorKillExactly interface {
+	TriggerControlDataIndicatorKill
+	isTriggerControlDataIndicatorKill() bool
+}
+
+// _TriggerControlDataIndicatorKill is the data-structure of this message
+type _TriggerControlDataIndicatorKill struct {
+	*_TriggerControlData
+}
+
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for discriminator values.
+///////////////////////
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
+func (m *_TriggerControlDataIndicatorKill) InitializeParent(parent TriggerControlData, commandTypeContainer TriggerControlCommandTypeContainer, triggerGroup byte) {
+	m.CommandTypeContainer = commandTypeContainer
+	m.TriggerGroup = triggerGroup
+}
+
+func (m *_TriggerControlDataIndicatorKill) GetParent() TriggerControlData {
+	return m._TriggerControlData
+}
+
+// NewTriggerControlDataIndicatorKill factory function for _TriggerControlDataIndicatorKill
+func NewTriggerControlDataIndicatorKill(commandTypeContainer TriggerControlCommandTypeContainer, triggerGroup byte) *_TriggerControlDataIndicatorKill {
+	_result := &_TriggerControlDataIndicatorKill{
+		_TriggerControlData: NewTriggerControlData(commandTypeContainer, triggerGroup),
+	}
+	_result._TriggerControlData._TriggerControlDataChildRequirements = _result
+	return _result
+}
+
+// Deprecated: use the interface for direct cast
+func CastTriggerControlDataIndicatorKill(structType interface{}) TriggerControlDataIndicatorKill {
+	if casted, ok := structType.(TriggerControlDataIndicatorKill); ok {
+		return casted
+	}
+	if casted, ok := structType.(*TriggerControlDataIndicatorKill); ok {
+		return *casted
+	}
+	return nil
+}
+
+func (m *_TriggerControlDataIndicatorKill) GetTypeName() string {
+	return "TriggerControlDataIndicatorKill"
+}
+
+func (m *_TriggerControlDataIndicatorKill) GetLengthInBits() uint16 {
+	return m.GetLengthInBitsConditional(false)
+}
+
+func (m *_TriggerControlDataIndicatorKill) GetLengthInBitsConditional(lastItem bool) uint16 {
+	lengthInBits := uint16(m.GetParentLengthInBits())
+
+	return lengthInBits
+}
+
+func (m *_TriggerControlDataIndicatorKill) GetLengthInBytes() uint16 {
+	return m.GetLengthInBits() / 8
+}
+
+func TriggerControlDataIndicatorKillParse(readBuffer utils.ReadBuffer) (TriggerControlDataIndicatorKill, error) {
+	positionAware := readBuffer
+	_ = positionAware
+	if pullErr := readBuffer.PullContext("TriggerControlDataIndicatorKill"); pullErr != nil {
+		return nil, errors.Wrap(pullErr, "Error pulling for TriggerControlDataIndicatorKill")
+	}
+	currentPos := positionAware.GetPos()
+	_ = currentPos
+
+	if closeErr := readBuffer.CloseContext("TriggerControlDataIndicatorKill"); closeErr != nil {
+		return nil, errors.Wrap(closeErr, "Error closing for TriggerControlDataIndicatorKill")
+	}
+
+	// Create a partially initialized instance
+	_child := &_TriggerControlDataIndicatorKill{
+		_TriggerControlData: &_TriggerControlData{},
+	}
+	_child._TriggerControlData._TriggerControlDataChildRequirements = _child
+	return _child, nil
+}
+
+func (m *_TriggerControlDataIndicatorKill) Serialize(writeBuffer utils.WriteBuffer) error {
+	positionAware := writeBuffer
+	_ = positionAware
+	ser := func() error {
+		if pushErr := writeBuffer.PushContext("TriggerControlDataIndicatorKill"); pushErr != nil {
+			return errors.Wrap(pushErr, "Error pushing for TriggerControlDataIndicatorKill")
+		}
+
+		if popErr := writeBuffer.PopContext("TriggerControlDataIndicatorKill"); popErr != nil {
+			return errors.Wrap(popErr, "Error popping for TriggerControlDataIndicatorKill")
+		}
+		return nil
+	}
+	return m.SerializeParent(writeBuffer, m, ser)
+}
+
+func (m *_TriggerControlDataIndicatorKill) isTriggerControlDataIndicatorKill() bool {
+	return true
+}
+
+func (m *_TriggerControlDataIndicatorKill) String() string {
+	if m == nil {
+		return "<nil>"
+	}
+	writeBuffer := utils.NewBoxedWriteBufferWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(m); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
diff --git a/plc4go/protocols/cbus/readwrite/model/TriggerControlDataLabel.go b/plc4go/protocols/cbus/readwrite/model/TriggerControlDataLabel.go
new file mode 100644
index 000000000..56ded8900
--- /dev/null
+++ b/plc4go/protocols/cbus/readwrite/model/TriggerControlDataLabel.go
@@ -0,0 +1,300 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package model
+
+import (
+	"github.com/apache/plc4x/plc4go/internal/spi/utils"
+	"github.com/pkg/errors"
+)
+
+// Code generated by code-generation. DO NOT EDIT.
+
+// TriggerControlDataLabel is the corresponding interface of TriggerControlDataLabel
+type TriggerControlDataLabel interface {
+	utils.LengthAware
+	utils.Serializable
+	TriggerControlData
+	// GetTriggerControlOptions returns TriggerControlOptions (property field)
+	GetTriggerControlOptions() TriggerControlLabelOptions
+	// GetActionSelector returns ActionSelector (property field)
+	GetActionSelector() byte
+	// GetLanguage returns Language (property field)
+	GetLanguage() *Language
+	// GetData returns Data (property field)
+	GetData() []byte
+}
+
+// TriggerControlDataLabelExactly can be used when we want exactly this type and not a type which fulfills TriggerControlDataLabel.
+// This is useful for switch cases.
+type TriggerControlDataLabelExactly interface {
+	TriggerControlDataLabel
+	isTriggerControlDataLabel() bool
+}
+
+// _TriggerControlDataLabel is the data-structure of this message
+type _TriggerControlDataLabel struct {
+	*_TriggerControlData
+	TriggerControlOptions TriggerControlLabelOptions
+	ActionSelector        byte
+	Language              *Language
+	Data                  []byte
+}
+
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for discriminator values.
+///////////////////////
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
+func (m *_TriggerControlDataLabel) InitializeParent(parent TriggerControlData, commandTypeContainer TriggerControlCommandTypeContainer, triggerGroup byte) {
+	m.CommandTypeContainer = commandTypeContainer
+	m.TriggerGroup = triggerGroup
+}
+
+func (m *_TriggerControlDataLabel) GetParent() TriggerControlData {
+	return m._TriggerControlData
+}
+
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for property fields.
+///////////////////////
+
+func (m *_TriggerControlDataLabel) GetTriggerControlOptions() TriggerControlLabelOptions {
+	return m.TriggerControlOptions
+}
+
+func (m *_TriggerControlDataLabel) GetActionSelector() byte {
+	return m.ActionSelector
+}
+
+func (m *_TriggerControlDataLabel) GetLanguage() *Language {
+	return m.Language
+}
+
+func (m *_TriggerControlDataLabel) GetData() []byte {
+	return m.Data
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
+// NewTriggerControlDataLabel factory function for _TriggerControlDataLabel
+func NewTriggerControlDataLabel(triggerControlOptions TriggerControlLabelOptions, actionSelector byte, language *Language, data []byte, commandTypeContainer TriggerControlCommandTypeContainer, triggerGroup byte) *_TriggerControlDataLabel {
+	_result := &_TriggerControlDataLabel{
+		TriggerControlOptions: triggerControlOptions,
+		ActionSelector:        actionSelector,
+		Language:              language,
+		Data:                  data,
+		_TriggerControlData:   NewTriggerControlData(commandTypeContainer, triggerGroup),
+	}
+	_result._TriggerControlData._TriggerControlDataChildRequirements = _result
+	return _result
+}
+
+// Deprecated: use the interface for direct cast
+func CastTriggerControlDataLabel(structType interface{}) TriggerControlDataLabel {
+	if casted, ok := structType.(TriggerControlDataLabel); ok {
+		return casted
+	}
+	if casted, ok := structType.(*TriggerControlDataLabel); ok {
+		return *casted
+	}
+	return nil
+}
+
+func (m *_TriggerControlDataLabel) GetTypeName() string {
+	return "TriggerControlDataLabel"
+}
+
+func (m *_TriggerControlDataLabel) GetLengthInBits() uint16 {
+	return m.GetLengthInBitsConditional(false)
+}
+
+func (m *_TriggerControlDataLabel) GetLengthInBitsConditional(lastItem bool) uint16 {
+	lengthInBits := uint16(m.GetParentLengthInBits())
+
+	// Simple field (triggerControlOptions)
+	lengthInBits += m.TriggerControlOptions.GetLengthInBits()
+
+	// Simple field (actionSelector)
+	lengthInBits += 8
+
+	// Optional Field (language)
+	if m.Language != nil {
+		lengthInBits += 8
+	}
+
+	// Array field
+	if len(m.Data) > 0 {
+		lengthInBits += 8 * uint16(len(m.Data))
+	}
+
+	return lengthInBits
+}
+
+func (m *_TriggerControlDataLabel) GetLengthInBytes() uint16 {
+	return m.GetLengthInBits() / 8
+}
+
+func TriggerControlDataLabelParse(readBuffer utils.ReadBuffer, commandTypeContainer TriggerControlCommandTypeContainer) (TriggerControlDataLabel, error) {
+	positionAware := readBuffer
+	_ = positionAware
+	if pullErr := readBuffer.PullContext("TriggerControlDataLabel"); pullErr != nil {
+		return nil, errors.Wrap(pullErr, "Error pulling for TriggerControlDataLabel")
+	}
+	currentPos := positionAware.GetPos()
+	_ = currentPos
+
+	// Simple Field (triggerControlOptions)
+	if pullErr := readBuffer.PullContext("triggerControlOptions"); pullErr != nil {
+		return nil, errors.Wrap(pullErr, "Error pulling for triggerControlOptions")
+	}
+	_triggerControlOptions, _triggerControlOptionsErr := TriggerControlLabelOptionsParse(readBuffer)
+	if _triggerControlOptionsErr != nil {
+		return nil, errors.Wrap(_triggerControlOptionsErr, "Error parsing 'triggerControlOptions' field of TriggerControlDataLabel")
+	}
+	triggerControlOptions := _triggerControlOptions.(TriggerControlLabelOptions)
+	if closeErr := readBuffer.CloseContext("triggerControlOptions"); closeErr != nil {
+		return nil, errors.Wrap(closeErr, "Error closing for triggerControlOptions")
+	}
+
+	// Simple Field (actionSelector)
+	_actionSelector, _actionSelectorErr := readBuffer.ReadByte("actionSelector")
+	if _actionSelectorErr != nil {
+		return nil, errors.Wrap(_actionSelectorErr, "Error parsing 'actionSelector' field of TriggerControlDataLabel")
+	}
+	actionSelector := _actionSelector
+
+	// Optional Field (language) (Can be skipped, if a given expression evaluates to false)
+	var language *Language = nil
+	if bool((triggerControlOptions.GetLabelType()) != (TriggerControlLabelType_LOAD_DYNAMIC_ICON)) {
+		if pullErr := readBuffer.PullContext("language"); pullErr != nil {
+			return nil, errors.Wrap(pullErr, "Error pulling for language")
+		}
+		_val, _err := LanguageParse(readBuffer)
+		if _err != nil {
+			return nil, errors.Wrap(_err, "Error parsing 'language' field of TriggerControlDataLabel")
+		}
+		language = &_val
+		if closeErr := readBuffer.CloseContext("language"); closeErr != nil {
+			return nil, errors.Wrap(closeErr, "Error closing for language")
+		}
+	}
+	// Byte Array field (data)
+	numberOfBytesdata := int(uint16(uint16(commandTypeContainer.NumBytes()) - uint16(uint16(utils.InlineIf(bool(bool((triggerControlOptions.GetLabelType()) != (TriggerControlLabelType_LOAD_DYNAMIC_ICON))), func() interface{} { return uint16(uint16(uint16(4))) }, func() interface{} { return uint16(uint16(uint16(3))) }).(uint16)))))
+	data, _readArrayErr := readBuffer.ReadByteArray("data", numberOfBytesdata)
+	if _readArrayErr != nil {
+		return nil, errors.Wrap(_readArrayErr, "Error parsing 'data' field of TriggerControlDataLabel")
+	}
+
+	if closeErr := readBuffer.CloseContext("TriggerControlDataLabel"); closeErr != nil {
+		return nil, errors.Wrap(closeErr, "Error closing for TriggerControlDataLabel")
+	}
+
+	// Create a partially initialized instance
+	_child := &_TriggerControlDataLabel{
+		TriggerControlOptions: triggerControlOptions,
+		ActionSelector:        actionSelector,
+		Language:              language,
+		Data:                  data,
+		_TriggerControlData:   &_TriggerControlData{},
+	}
+	_child._TriggerControlData._TriggerControlDataChildRequirements = _child
+	return _child, nil
+}
+
+func (m *_TriggerControlDataLabel) Serialize(writeBuffer utils.WriteBuffer) error {
+	positionAware := writeBuffer
+	_ = positionAware
+	ser := func() error {
+		if pushErr := writeBuffer.PushContext("TriggerControlDataLabel"); pushErr != nil {
+			return errors.Wrap(pushErr, "Error pushing for TriggerControlDataLabel")
+		}
+
+		// Simple Field (triggerControlOptions)
+		if pushErr := writeBuffer.PushContext("triggerControlOptions"); pushErr != nil {
+			return errors.Wrap(pushErr, "Error pushing for triggerControlOptions")
+		}
+		_triggerControlOptionsErr := writeBuffer.WriteSerializable(m.GetTriggerControlOptions())
+		if popErr := writeBuffer.PopContext("triggerControlOptions"); popErr != nil {
+			return errors.Wrap(popErr, "Error popping for triggerControlOptions")
+		}
+		if _triggerControlOptionsErr != nil {
+			return errors.Wrap(_triggerControlOptionsErr, "Error serializing 'triggerControlOptions' field")
+		}
+
+		// Simple Field (actionSelector)
+		actionSelector := byte(m.GetActionSelector())
+		_actionSelectorErr := writeBuffer.WriteByte("actionSelector", (actionSelector))
+		if _actionSelectorErr != nil {
+			return errors.Wrap(_actionSelectorErr, "Error serializing 'actionSelector' field")
+		}
+
+		// Optional Field (language) (Can be skipped, if the value is null)
+		var language *Language = nil
+		if m.GetLanguage() != nil {
+			if pushErr := writeBuffer.PushContext("language"); pushErr != nil {
+				return errors.Wrap(pushErr, "Error pushing for language")
+			}
+			language = m.GetLanguage()
+			_languageErr := writeBuffer.WriteSerializable(language)
+			if popErr := writeBuffer.PopContext("language"); popErr != nil {
+				return errors.Wrap(popErr, "Error popping for language")
+			}
+			if _languageErr != nil {
+				return errors.Wrap(_languageErr, "Error serializing 'language' field")
+			}
+		}
+
+		// Array Field (data)
+		// Byte Array field (data)
+		if err := writeBuffer.WriteByteArray("data", m.GetData()); err != nil {
+			return errors.Wrap(err, "Error serializing 'data' field")
+		}
+
+		if popErr := writeBuffer.PopContext("TriggerControlDataLabel"); popErr != nil {
+			return errors.Wrap(popErr, "Error popping for TriggerControlDataLabel")
+		}
+		return nil
+	}
+	return m.SerializeParent(writeBuffer, m, ser)
+}
+
+func (m *_TriggerControlDataLabel) isTriggerControlDataLabel() bool {
+	return true
+}
+
+func (m *_TriggerControlDataLabel) String() string {
+	if m == nil {
+		return "<nil>"
+	}
+	writeBuffer := utils.NewBoxedWriteBufferWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(m); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
diff --git a/plc4go/protocols/cbus/readwrite/model/TriggerControlDataTriggerEvent.go b/plc4go/protocols/cbus/readwrite/model/TriggerControlDataTriggerEvent.go
new file mode 100644
index 000000000..58128d71c
--- /dev/null
+++ b/plc4go/protocols/cbus/readwrite/model/TriggerControlDataTriggerEvent.go
@@ -0,0 +1,191 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package model
+
+import (
+	"github.com/apache/plc4x/plc4go/internal/spi/utils"
+	"github.com/pkg/errors"
+)
+
+// Code generated by code-generation. DO NOT EDIT.
+
+// TriggerControlDataTriggerEvent is the corresponding interface of TriggerControlDataTriggerEvent
+type TriggerControlDataTriggerEvent interface {
+	utils.LengthAware
+	utils.Serializable
+	TriggerControlData
+	// GetActionSelector returns ActionSelector (property field)
+	GetActionSelector() byte
+}
+
+// TriggerControlDataTriggerEventExactly can be used when we want exactly this type and not a type which fulfills TriggerControlDataTriggerEvent.
+// This is useful for switch cases.
+type TriggerControlDataTriggerEventExactly interface {
+	TriggerControlDataTriggerEvent
+	isTriggerControlDataTriggerEvent() bool
+}
+
+// _TriggerControlDataTriggerEvent is the data-structure of this message
+type _TriggerControlDataTriggerEvent struct {
+	*_TriggerControlData
+	ActionSelector byte
+}
+
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for discriminator values.
+///////////////////////
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
+func (m *_TriggerControlDataTriggerEvent) InitializeParent(parent TriggerControlData, commandTypeContainer TriggerControlCommandTypeContainer, triggerGroup byte) {
+	m.CommandTypeContainer = commandTypeContainer
+	m.TriggerGroup = triggerGroup
+}
+
+func (m *_TriggerControlDataTriggerEvent) GetParent() TriggerControlData {
+	return m._TriggerControlData
+}
+
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for property fields.
+///////////////////////
+
+func (m *_TriggerControlDataTriggerEvent) GetActionSelector() byte {
+	return m.ActionSelector
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
+// NewTriggerControlDataTriggerEvent factory function for _TriggerControlDataTriggerEvent
+func NewTriggerControlDataTriggerEvent(actionSelector byte, commandTypeContainer TriggerControlCommandTypeContainer, triggerGroup byte) *_TriggerControlDataTriggerEvent {
+	_result := &_TriggerControlDataTriggerEvent{
+		ActionSelector:      actionSelector,
+		_TriggerControlData: NewTriggerControlData(commandTypeContainer, triggerGroup),
+	}
+	_result._TriggerControlData._TriggerControlDataChildRequirements = _result
+	return _result
+}
+
+// Deprecated: use the interface for direct cast
+func CastTriggerControlDataTriggerEvent(structType interface{}) TriggerControlDataTriggerEvent {
+	if casted, ok := structType.(TriggerControlDataTriggerEvent); ok {
+		return casted
+	}
+	if casted, ok := structType.(*TriggerControlDataTriggerEvent); ok {
+		return *casted
+	}
+	return nil
+}
+
+func (m *_TriggerControlDataTriggerEvent) GetTypeName() string {
+	return "TriggerControlDataTriggerEvent"
+}
+
+func (m *_TriggerControlDataTriggerEvent) GetLengthInBits() uint16 {
+	return m.GetLengthInBitsConditional(false)
+}
+
+func (m *_TriggerControlDataTriggerEvent) GetLengthInBitsConditional(lastItem bool) uint16 {
+	lengthInBits := uint16(m.GetParentLengthInBits())
+
+	// Simple field (actionSelector)
+	lengthInBits += 8
+
+	return lengthInBits
+}
+
+func (m *_TriggerControlDataTriggerEvent) GetLengthInBytes() uint16 {
+	return m.GetLengthInBits() / 8
+}
+
+func TriggerControlDataTriggerEventParse(readBuffer utils.ReadBuffer) (TriggerControlDataTriggerEvent, error) {
+	positionAware := readBuffer
+	_ = positionAware
+	if pullErr := readBuffer.PullContext("TriggerControlDataTriggerEvent"); pullErr != nil {
+		return nil, errors.Wrap(pullErr, "Error pulling for TriggerControlDataTriggerEvent")
+	}
+	currentPos := positionAware.GetPos()
+	_ = currentPos
+
+	// Simple Field (actionSelector)
+	_actionSelector, _actionSelectorErr := readBuffer.ReadByte("actionSelector")
+	if _actionSelectorErr != nil {
+		return nil, errors.Wrap(_actionSelectorErr, "Error parsing 'actionSelector' field of TriggerControlDataTriggerEvent")
+	}
+	actionSelector := _actionSelector
+
+	if closeErr := readBuffer.CloseContext("TriggerControlDataTriggerEvent"); closeErr != nil {
+		return nil, errors.Wrap(closeErr, "Error closing for TriggerControlDataTriggerEvent")
+	}
+
+	// Create a partially initialized instance
+	_child := &_TriggerControlDataTriggerEvent{
+		ActionSelector:      actionSelector,
+		_TriggerControlData: &_TriggerControlData{},
+	}
+	_child._TriggerControlData._TriggerControlDataChildRequirements = _child
+	return _child, nil
+}
+
+func (m *_TriggerControlDataTriggerEvent) Serialize(writeBuffer utils.WriteBuffer) error {
+	positionAware := writeBuffer
+	_ = positionAware
+	ser := func() error {
+		if pushErr := writeBuffer.PushContext("TriggerControlDataTriggerEvent"); pushErr != nil {
+			return errors.Wrap(pushErr, "Error pushing for TriggerControlDataTriggerEvent")
+		}
+
+		// Simple Field (actionSelector)
+		actionSelector := byte(m.GetActionSelector())
+		_actionSelectorErr := writeBuffer.WriteByte("actionSelector", (actionSelector))
+		if _actionSelectorErr != nil {
+			return errors.Wrap(_actionSelectorErr, "Error serializing 'actionSelector' field")
+		}
+
+		if popErr := writeBuffer.PopContext("TriggerControlDataTriggerEvent"); popErr != nil {
+			return errors.Wrap(popErr, "Error popping for TriggerControlDataTriggerEvent")
+		}
+		return nil
+	}
+	return m.SerializeParent(writeBuffer, m, ser)
+}
+
+func (m *_TriggerControlDataTriggerEvent) isTriggerControlDataTriggerEvent() bool {
+	return true
+}
+
+func (m *_TriggerControlDataTriggerEvent) String() string {
+	if m == nil {
+		return "<nil>"
+	}
+	writeBuffer := utils.NewBoxedWriteBufferWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(m); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
diff --git a/plc4go/protocols/cbus/readwrite/model/TriggerControlDataTriggerMin.go b/plc4go/protocols/cbus/readwrite/model/TriggerControlDataTriggerMin.go
new file mode 100644
index 000000000..1cdbb4a0a
--- /dev/null
+++ b/plc4go/protocols/cbus/readwrite/model/TriggerControlDataTriggerMin.go
@@ -0,0 +1,155 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package model
+
+import (
+	"github.com/apache/plc4x/plc4go/internal/spi/utils"
+	"github.com/pkg/errors"
+)
+
+// Code generated by code-generation. DO NOT EDIT.
+
+// TriggerControlDataTriggerMin is the corresponding interface of TriggerControlDataTriggerMin
+type TriggerControlDataTriggerMin interface {
+	utils.LengthAware
+	utils.Serializable
+	TriggerControlData
+}
+
+// TriggerControlDataTriggerMinExactly can be used when we want exactly this type and not a type which fulfills TriggerControlDataTriggerMin.
+// This is useful for switch cases.
+type TriggerControlDataTriggerMinExactly interface {
+	TriggerControlDataTriggerMin
+	isTriggerControlDataTriggerMin() bool
+}
+
+// _TriggerControlDataTriggerMin is the data-structure of this message
+type _TriggerControlDataTriggerMin struct {
+	*_TriggerControlData
+}
+
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for discriminator values.
+///////////////////////
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
+func (m *_TriggerControlDataTriggerMin) InitializeParent(parent TriggerControlData, commandTypeContainer TriggerControlCommandTypeContainer, triggerGroup byte) {
+	m.CommandTypeContainer = commandTypeContainer
+	m.TriggerGroup = triggerGroup
+}
+
+func (m *_TriggerControlDataTriggerMin) GetParent() TriggerControlData {
+	return m._TriggerControlData
+}
+
+// NewTriggerControlDataTriggerMin factory function for _TriggerControlDataTriggerMin
+func NewTriggerControlDataTriggerMin(commandTypeContainer TriggerControlCommandTypeContainer, triggerGroup byte) *_TriggerControlDataTriggerMin {
+	_result := &_TriggerControlDataTriggerMin{
+		_TriggerControlData: NewTriggerControlData(commandTypeContainer, triggerGroup),
+	}
+	_result._TriggerControlData._TriggerControlDataChildRequirements = _result
+	return _result
+}
+
+// Deprecated: use the interface for direct cast
+func CastTriggerControlDataTriggerMin(structType interface{}) TriggerControlDataTriggerMin {
+	if casted, ok := structType.(TriggerControlDataTriggerMin); ok {
+		return casted
+	}
+	if casted, ok := structType.(*TriggerControlDataTriggerMin); ok {
+		return *casted
+	}
+	return nil
+}
+
+func (m *_TriggerControlDataTriggerMin) GetTypeName() string {
+	return "TriggerControlDataTriggerMin"
+}
+
+func (m *_TriggerControlDataTriggerMin) GetLengthInBits() uint16 {
+	return m.GetLengthInBitsConditional(false)
+}
+
+func (m *_TriggerControlDataTriggerMin) GetLengthInBitsConditional(lastItem bool) uint16 {
+	lengthInBits := uint16(m.GetParentLengthInBits())
+
+	return lengthInBits
+}
+
+func (m *_TriggerControlDataTriggerMin) GetLengthInBytes() uint16 {
+	return m.GetLengthInBits() / 8
+}
+
+func TriggerControlDataTriggerMinParse(readBuffer utils.ReadBuffer) (TriggerControlDataTriggerMin, error) {
+	positionAware := readBuffer
+	_ = positionAware
+	if pullErr := readBuffer.PullContext("TriggerControlDataTriggerMin"); pullErr != nil {
+		return nil, errors.Wrap(pullErr, "Error pulling for TriggerControlDataTriggerMin")
+	}
+	currentPos := positionAware.GetPos()
+	_ = currentPos
+
+	if closeErr := readBuffer.CloseContext("TriggerControlDataTriggerMin"); closeErr != nil {
+		return nil, errors.Wrap(closeErr, "Error closing for TriggerControlDataTriggerMin")
+	}
+
+	// Create a partially initialized instance
+	_child := &_TriggerControlDataTriggerMin{
+		_TriggerControlData: &_TriggerControlData{},
+	}
+	_child._TriggerControlData._TriggerControlDataChildRequirements = _child
+	return _child, nil
+}
+
+func (m *_TriggerControlDataTriggerMin) Serialize(writeBuffer utils.WriteBuffer) error {
+	positionAware := writeBuffer
+	_ = positionAware
+	ser := func() error {
+		if pushErr := writeBuffer.PushContext("TriggerControlDataTriggerMin"); pushErr != nil {
+			return errors.Wrap(pushErr, "Error pushing for TriggerControlDataTriggerMin")
+		}
+
+		if popErr := writeBuffer.PopContext("TriggerControlDataTriggerMin"); popErr != nil {
+			return errors.Wrap(popErr, "Error popping for TriggerControlDataTriggerMin")
+		}
+		return nil
+	}
+	return m.SerializeParent(writeBuffer, m, ser)
+}
+
+func (m *_TriggerControlDataTriggerMin) isTriggerControlDataTriggerMin() bool {
+	return true
+}
+
+func (m *_TriggerControlDataTriggerMin) String() string {
+	if m == nil {
+		return "<nil>"
+	}
+	writeBuffer := utils.NewBoxedWriteBufferWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(m); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
diff --git a/plc4go/protocols/cbus/readwrite/model/TriggerControlLabelFlavour.go b/plc4go/protocols/cbus/readwrite/model/TriggerControlLabelFlavour.go
new file mode 100644
index 000000000..cfb4b9305
--- /dev/null
+++ b/plc4go/protocols/cbus/readwrite/model/TriggerControlLabelFlavour.go
@@ -0,0 +1,145 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package model
+
+import (
+	"github.com/apache/plc4x/plc4go/internal/spi/utils"
+	"github.com/pkg/errors"
+	"github.com/rs/zerolog/log"
+)
+
+// Code generated by code-generation. DO NOT EDIT.
+
+// TriggerControlLabelFlavour is an enum
+type TriggerControlLabelFlavour uint8
+
+type ITriggerControlLabelFlavour interface {
+	Serialize(writeBuffer utils.WriteBuffer) error
+}
+
+const (
+	TriggerControlLabelFlavour_FLAVOUR_0 TriggerControlLabelFlavour = 0
+	TriggerControlLabelFlavour_FLAVOUR_1 TriggerControlLabelFlavour = 1
+	TriggerControlLabelFlavour_FLAVOUR_2 TriggerControlLabelFlavour = 2
+	TriggerControlLabelFlavour_FLAVOUR_3 TriggerControlLabelFlavour = 3
+)
+
+var TriggerControlLabelFlavourValues []TriggerControlLabelFlavour
+
+func init() {
+	_ = errors.New
+	TriggerControlLabelFlavourValues = []TriggerControlLabelFlavour{
+		TriggerControlLabelFlavour_FLAVOUR_0,
+		TriggerControlLabelFlavour_FLAVOUR_1,
+		TriggerControlLabelFlavour_FLAVOUR_2,
+		TriggerControlLabelFlavour_FLAVOUR_3,
+	}
+}
+
+func TriggerControlLabelFlavourByValue(value uint8) (enum TriggerControlLabelFlavour, ok bool) {
+	switch value {
+	case 0:
+		return TriggerControlLabelFlavour_FLAVOUR_0, true
+	case 1:
+		return TriggerControlLabelFlavour_FLAVOUR_1, true
+	case 2:
+		return TriggerControlLabelFlavour_FLAVOUR_2, true
+	case 3:
+		return TriggerControlLabelFlavour_FLAVOUR_3, true
+	}
+	return 0, false
+}
+
+func TriggerControlLabelFlavourByName(value string) (enum TriggerControlLabelFlavour, ok bool) {
+	switch value {
+	case "FLAVOUR_0":
+		return TriggerControlLabelFlavour_FLAVOUR_0, true
+	case "FLAVOUR_1":
+		return TriggerControlLabelFlavour_FLAVOUR_1, true
+	case "FLAVOUR_2":
+		return TriggerControlLabelFlavour_FLAVOUR_2, true
+	case "FLAVOUR_3":
+		return TriggerControlLabelFlavour_FLAVOUR_3, true
+	}
+	return 0, false
+}
+
+func TriggerControlLabelFlavourKnows(value uint8) bool {
+	for _, typeValue := range TriggerControlLabelFlavourValues {
+		if uint8(typeValue) == value {
+			return true
+		}
+	}
+	return false
+}
+
+func CastTriggerControlLabelFlavour(structType interface{}) TriggerControlLabelFlavour {
+	castFunc := func(typ interface{}) TriggerControlLabelFlavour {
+		if sTriggerControlLabelFlavour, ok := typ.(TriggerControlLabelFlavour); ok {
+			return sTriggerControlLabelFlavour
+		}
+		return 0
+	}
+	return castFunc(structType)
+}
+
+func (m TriggerControlLabelFlavour) GetLengthInBits() uint16 {
+	return 2
+}
+
+func (m TriggerControlLabelFlavour) GetLengthInBytes() uint16 {
+	return m.GetLengthInBits() / 8
+}
+
+func TriggerControlLabelFlavourParse(readBuffer utils.ReadBuffer) (TriggerControlLabelFlavour, error) {
+	val, err := readBuffer.ReadUint8("TriggerControlLabelFlavour", 2)
+	if err != nil {
+		return 0, errors.Wrap(err, "error reading TriggerControlLabelFlavour")
+	}
+	if enum, ok := TriggerControlLabelFlavourByValue(val); !ok {
+		log.Debug().Msgf("no value %x found for RequestType", val)
+		return TriggerControlLabelFlavour(val), nil
+	} else {
+		return enum, nil
+	}
+}
+
+func (e TriggerControlLabelFlavour) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteUint8("TriggerControlLabelFlavour", 2, uint8(e), utils.WithAdditionalStringRepresentation(e.PLC4XEnumName()))
+}
+
+// PLC4XEnumName returns the name that is used in code to identify this enum
+func (e TriggerControlLabelFlavour) PLC4XEnumName() string {
+	switch e {
+	case TriggerControlLabelFlavour_FLAVOUR_0:
+		return "FLAVOUR_0"
+	case TriggerControlLabelFlavour_FLAVOUR_1:
+		return "FLAVOUR_1"
+	case TriggerControlLabelFlavour_FLAVOUR_2:
+		return "FLAVOUR_2"
+	case TriggerControlLabelFlavour_FLAVOUR_3:
+		return "FLAVOUR_3"
+	}
+	return ""
+}
+
+func (e TriggerControlLabelFlavour) String() string {
+	return e.PLC4XEnumName()
+}
diff --git a/plc4go/protocols/cbus/readwrite/model/LightingLabelOptions.go b/plc4go/protocols/cbus/readwrite/model/TriggerControlLabelOptions.go
similarity index 60%
copy from plc4go/protocols/cbus/readwrite/model/LightingLabelOptions.go
copy to plc4go/protocols/cbus/readwrite/model/TriggerControlLabelOptions.go
index 466ac9b85..199437994 100644
--- a/plc4go/protocols/cbus/readwrite/model/LightingLabelOptions.go
+++ b/plc4go/protocols/cbus/readwrite/model/TriggerControlLabelOptions.go
@@ -27,35 +27,35 @@ import (
 
 // Code generated by code-generation. DO NOT EDIT.
 
-// LightingLabelOptions is the corresponding interface of LightingLabelOptions
-type LightingLabelOptions interface {
+// TriggerControlLabelOptions is the corresponding interface of TriggerControlLabelOptions
+type TriggerControlLabelOptions interface {
 	utils.LengthAware
 	utils.Serializable
 	// GetReservedBit7 returns ReservedBit7 (property field)
 	GetReservedBit7() bool
 	// GetLabelFlavour returns LabelFlavour (property field)
-	GetLabelFlavour() LightingLabelFlavour
-	// GetReservedBit4 returns ReservedBit4 (property field)
-	GetReservedBit4() bool
+	GetLabelFlavour() TriggerControlLabelFlavour
+	// GetReservedBit3 returns ReservedBit3 (property field)
+	GetReservedBit3() bool
 	// GetLabelType returns LabelType (property field)
-	GetLabelType() LightingLabelType
+	GetLabelType() TriggerControlLabelType
 	// GetReservedBit0 returns ReservedBit0 (property field)
 	GetReservedBit0() bool
 }
 
-// LightingLabelOptionsExactly can be used when we want exactly this type and not a type which fulfills LightingLabelOptions.
+// TriggerControlLabelOptionsExactly can be used when we want exactly this type and not a type which fulfills TriggerControlLabelOptions.
 // This is useful for switch cases.
-type LightingLabelOptionsExactly interface {
-	LightingLabelOptions
-	isLightingLabelOptions() bool
+type TriggerControlLabelOptionsExactly interface {
+	TriggerControlLabelOptions
+	isTriggerControlLabelOptions() bool
 }
 
-// _LightingLabelOptions is the data-structure of this message
-type _LightingLabelOptions struct {
+// _TriggerControlLabelOptions is the data-structure of this message
+type _TriggerControlLabelOptions struct {
 	ReservedBit7 bool
-	LabelFlavour LightingLabelFlavour
-	ReservedBit4 bool
-	LabelType    LightingLabelType
+	LabelFlavour TriggerControlLabelFlavour
+	ReservedBit3 bool
+	LabelType    TriggerControlLabelType
 	ReservedBit0 bool
 }
 
@@ -64,23 +64,23 @@ type _LightingLabelOptions struct {
 /////////////////////// Accessors for property fields.
 ///////////////////////
 
-func (m *_LightingLabelOptions) GetReservedBit7() bool {
+func (m *_TriggerControlLabelOptions) GetReservedBit7() bool {
 	return m.ReservedBit7
 }
 
-func (m *_LightingLabelOptions) GetLabelFlavour() LightingLabelFlavour {
+func (m *_TriggerControlLabelOptions) GetLabelFlavour() TriggerControlLabelFlavour {
 	return m.LabelFlavour
 }
 
-func (m *_LightingLabelOptions) GetReservedBit4() bool {
-	return m.ReservedBit4
+func (m *_TriggerControlLabelOptions) GetReservedBit3() bool {
+	return m.ReservedBit3
 }
 
-func (m *_LightingLabelOptions) GetLabelType() LightingLabelType {
+func (m *_TriggerControlLabelOptions) GetLabelType() TriggerControlLabelType {
 	return m.LabelType
 }
 
-func (m *_LightingLabelOptions) GetReservedBit0() bool {
+func (m *_TriggerControlLabelOptions) GetReservedBit0() bool {
 	return m.ReservedBit0
 }
 
@@ -89,31 +89,31 @@ func (m *_LightingLabelOptions) GetReservedBit0() bool {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-// NewLightingLabelOptions factory function for _LightingLabelOptions
-func NewLightingLabelOptions(reservedBit7 bool, labelFlavour LightingLabelFlavour, reservedBit4 bool, labelType LightingLabelType, reservedBit0 bool) *_LightingLabelOptions {
-	return &_LightingLabelOptions{ReservedBit7: reservedBit7, LabelFlavour: labelFlavour, ReservedBit4: reservedBit4, LabelType: labelType, ReservedBit0: reservedBit0}
+// NewTriggerControlLabelOptions factory function for _TriggerControlLabelOptions
+func NewTriggerControlLabelOptions(reservedBit7 bool, labelFlavour TriggerControlLabelFlavour, reservedBit3 bool, labelType TriggerControlLabelType, reservedBit0 bool) *_TriggerControlLabelOptions {
+	return &_TriggerControlLabelOptions{ReservedBit7: reservedBit7, LabelFlavour: labelFlavour, ReservedBit3: reservedBit3, LabelType: labelType, ReservedBit0: reservedBit0}
 }
 
 // Deprecated: use the interface for direct cast
-func CastLightingLabelOptions(structType interface{}) LightingLabelOptions {
-	if casted, ok := structType.(LightingLabelOptions); ok {
+func CastTriggerControlLabelOptions(structType interface{}) TriggerControlLabelOptions {
+	if casted, ok := structType.(TriggerControlLabelOptions); ok {
 		return casted
 	}
-	if casted, ok := structType.(*LightingLabelOptions); ok {
+	if casted, ok := structType.(*TriggerControlLabelOptions); ok {
 		return *casted
 	}
 	return nil
 }
 
-func (m *_LightingLabelOptions) GetTypeName() string {
-	return "LightingLabelOptions"
+func (m *_TriggerControlLabelOptions) GetTypeName() string {
+	return "TriggerControlLabelOptions"
 }
 
-func (m *_LightingLabelOptions) GetLengthInBits() uint16 {
+func (m *_TriggerControlLabelOptions) GetLengthInBits() uint16 {
 	return m.GetLengthInBitsConditional(false)
 }
 
-func (m *_LightingLabelOptions) GetLengthInBitsConditional(lastItem bool) uint16 {
+func (m *_TriggerControlLabelOptions) GetLengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(0)
 
 	// Simple field (reservedBit7)
@@ -125,7 +125,7 @@ func (m *_LightingLabelOptions) GetLengthInBitsConditional(lastItem bool) uint16
 	// Reserved Field (reserved)
 	lengthInBits += 1
 
-	// Simple field (reservedBit4)
+	// Simple field (reservedBit3)
 	lengthInBits += 1
 
 	// Simple field (labelType)
@@ -137,15 +137,15 @@ func (m *_LightingLabelOptions) GetLengthInBitsConditional(lastItem bool) uint16
 	return lengthInBits
 }
 
-func (m *_LightingLabelOptions) GetLengthInBytes() uint16 {
+func (m *_TriggerControlLabelOptions) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
 
-func LightingLabelOptionsParse(readBuffer utils.ReadBuffer) (LightingLabelOptions, error) {
+func TriggerControlLabelOptionsParse(readBuffer utils.ReadBuffer) (TriggerControlLabelOptions, error) {
 	positionAware := readBuffer
 	_ = positionAware
-	if pullErr := readBuffer.PullContext("LightingLabelOptions"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for LightingLabelOptions")
+	if pullErr := readBuffer.PullContext("TriggerControlLabelOptions"); pullErr != nil {
+		return nil, errors.Wrap(pullErr, "Error pulling for TriggerControlLabelOptions")
 	}
 	currentPos := positionAware.GetPos()
 	_ = currentPos
@@ -153,7 +153,7 @@ func LightingLabelOptionsParse(readBuffer utils.ReadBuffer) (LightingLabelOption
 	// Simple Field (reservedBit7)
 	_reservedBit7, _reservedBit7Err := readBuffer.ReadBit("reservedBit7")
 	if _reservedBit7Err != nil {
-		return nil, errors.Wrap(_reservedBit7Err, "Error parsing 'reservedBit7' field of LightingLabelOptions")
+		return nil, errors.Wrap(_reservedBit7Err, "Error parsing 'reservedBit7' field of TriggerControlLabelOptions")
 	}
 	reservedBit7 := _reservedBit7
 
@@ -161,9 +161,9 @@ func LightingLabelOptionsParse(readBuffer utils.ReadBuffer) (LightingLabelOption
 	if pullErr := readBuffer.PullContext("labelFlavour"); pullErr != nil {
 		return nil, errors.Wrap(pullErr, "Error pulling for labelFlavour")
 	}
-	_labelFlavour, _labelFlavourErr := LightingLabelFlavourParse(readBuffer)
+	_labelFlavour, _labelFlavourErr := TriggerControlLabelFlavourParse(readBuffer)
 	if _labelFlavourErr != nil {
-		return nil, errors.Wrap(_labelFlavourErr, "Error parsing 'labelFlavour' field of LightingLabelOptions")
+		return nil, errors.Wrap(_labelFlavourErr, "Error parsing 'labelFlavour' field of TriggerControlLabelOptions")
 	}
 	labelFlavour := _labelFlavour
 	if closeErr := readBuffer.CloseContext("labelFlavour"); closeErr != nil {
@@ -174,7 +174,7 @@ func LightingLabelOptionsParse(readBuffer utils.ReadBuffer) (LightingLabelOption
 	{
 		reserved, _err := readBuffer.ReadBit("reserved")
 		if _err != nil {
-			return nil, errors.Wrap(_err, "Error parsing 'reserved' field of LightingLabelOptions")
+			return nil, errors.Wrap(_err, "Error parsing 'reserved' field of TriggerControlLabelOptions")
 		}
 		if reserved != bool(false) {
 			log.Info().Fields(map[string]interface{}{
@@ -184,20 +184,20 @@ func LightingLabelOptionsParse(readBuffer utils.ReadBuffer) (LightingLabelOption
 		}
 	}
 
-	// Simple Field (reservedBit4)
-	_reservedBit4, _reservedBit4Err := readBuffer.ReadBit("reservedBit4")
-	if _reservedBit4Err != nil {
-		return nil, errors.Wrap(_reservedBit4Err, "Error parsing 'reservedBit4' field of LightingLabelOptions")
+	// Simple Field (reservedBit3)
+	_reservedBit3, _reservedBit3Err := readBuffer.ReadBit("reservedBit3")
+	if _reservedBit3Err != nil {
+		return nil, errors.Wrap(_reservedBit3Err, "Error parsing 'reservedBit3' field of TriggerControlLabelOptions")
 	}
-	reservedBit4 := _reservedBit4
+	reservedBit3 := _reservedBit3
 
 	// Simple Field (labelType)
 	if pullErr := readBuffer.PullContext("labelType"); pullErr != nil {
 		return nil, errors.Wrap(pullErr, "Error pulling for labelType")
 	}
-	_labelType, _labelTypeErr := LightingLabelTypeParse(readBuffer)
+	_labelType, _labelTypeErr := TriggerControlLabelTypeParse(readBuffer)
 	if _labelTypeErr != nil {
-		return nil, errors.Wrap(_labelTypeErr, "Error parsing 'labelType' field of LightingLabelOptions")
+		return nil, errors.Wrap(_labelTypeErr, "Error parsing 'labelType' field of TriggerControlLabelOptions")
 	}
 	labelType := _labelType
 	if closeErr := readBuffer.CloseContext("labelType"); closeErr != nil {
@@ -207,23 +207,23 @@ func LightingLabelOptionsParse(readBuffer utils.ReadBuffer) (LightingLabelOption
 	// Simple Field (reservedBit0)
 	_reservedBit0, _reservedBit0Err := readBuffer.ReadBit("reservedBit0")
 	if _reservedBit0Err != nil {
-		return nil, errors.Wrap(_reservedBit0Err, "Error parsing 'reservedBit0' field of LightingLabelOptions")
+		return nil, errors.Wrap(_reservedBit0Err, "Error parsing 'reservedBit0' field of TriggerControlLabelOptions")
 	}
 	reservedBit0 := _reservedBit0
 
-	if closeErr := readBuffer.CloseContext("LightingLabelOptions"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for LightingLabelOptions")
+	if closeErr := readBuffer.CloseContext("TriggerControlLabelOptions"); closeErr != nil {
+		return nil, errors.Wrap(closeErr, "Error closing for TriggerControlLabelOptions")
 	}
 
 	// Create the instance
-	return NewLightingLabelOptions(reservedBit7, labelFlavour, reservedBit4, labelType, reservedBit0), nil
+	return NewTriggerControlLabelOptions(reservedBit7, labelFlavour, reservedBit3, labelType, reservedBit0), nil
 }
 
-func (m *_LightingLabelOptions) Serialize(writeBuffer utils.WriteBuffer) error {
+func (m *_TriggerControlLabelOptions) Serialize(writeBuffer utils.WriteBuffer) error {
 	positionAware := writeBuffer
 	_ = positionAware
-	if pushErr := writeBuffer.PushContext("LightingLabelOptions"); pushErr != nil {
-		return errors.Wrap(pushErr, "Error pushing for LightingLabelOptions")
+	if pushErr := writeBuffer.PushContext("TriggerControlLabelOptions"); pushErr != nil {
+		return errors.Wrap(pushErr, "Error pushing for TriggerControlLabelOptions")
 	}
 
 	// Simple Field (reservedBit7)
@@ -253,11 +253,11 @@ func (m *_LightingLabelOptions) Serialize(writeBuffer utils.WriteBuffer) error {
 		}
 	}
 
-	// Simple Field (reservedBit4)
-	reservedBit4 := bool(m.GetReservedBit4())
-	_reservedBit4Err := writeBuffer.WriteBit("reservedBit4", (reservedBit4))
-	if _reservedBit4Err != nil {
-		return errors.Wrap(_reservedBit4Err, "Error serializing 'reservedBit4' field")
+	// Simple Field (reservedBit3)
+	reservedBit3 := bool(m.GetReservedBit3())
+	_reservedBit3Err := writeBuffer.WriteBit("reservedBit3", (reservedBit3))
+	if _reservedBit3Err != nil {
+		return errors.Wrap(_reservedBit3Err, "Error serializing 'reservedBit3' field")
 	}
 
 	// Simple Field (labelType)
@@ -279,17 +279,17 @@ func (m *_LightingLabelOptions) Serialize(writeBuffer utils.WriteBuffer) error {
 		return errors.Wrap(_reservedBit0Err, "Error serializing 'reservedBit0' field")
 	}
 
-	if popErr := writeBuffer.PopContext("LightingLabelOptions"); popErr != nil {
-		return errors.Wrap(popErr, "Error popping for LightingLabelOptions")
+	if popErr := writeBuffer.PopContext("TriggerControlLabelOptions"); popErr != nil {
+		return errors.Wrap(popErr, "Error popping for TriggerControlLabelOptions")
 	}
 	return nil
 }
 
-func (m *_LightingLabelOptions) isLightingLabelOptions() bool {
+func (m *_TriggerControlLabelOptions) isTriggerControlLabelOptions() bool {
 	return true
 }
 
-func (m *_LightingLabelOptions) String() string {
+func (m *_TriggerControlLabelOptions) String() string {
 	if m == nil {
 		return "<nil>"
 	}
diff --git a/plc4go/protocols/cbus/readwrite/model/TriggerControlLabelType.go b/plc4go/protocols/cbus/readwrite/model/TriggerControlLabelType.go
new file mode 100644
index 000000000..e807d1e83
--- /dev/null
+++ b/plc4go/protocols/cbus/readwrite/model/TriggerControlLabelType.go
@@ -0,0 +1,145 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package model
+
+import (
+	"github.com/apache/plc4x/plc4go/internal/spi/utils"
+	"github.com/pkg/errors"
+	"github.com/rs/zerolog/log"
+)
+
+// Code generated by code-generation. DO NOT EDIT.
+
+// TriggerControlLabelType is an enum
+type TriggerControlLabelType uint8
+
+type ITriggerControlLabelType interface {
+	Serialize(writeBuffer utils.WriteBuffer) error
+}
+
+const (
+	TriggerControlLabelType_TEXT_LABEL             TriggerControlLabelType = 0
+	TriggerControlLabelType_PREDEFINED_ICON        TriggerControlLabelType = 1
+	TriggerControlLabelType_LOAD_DYNAMIC_ICON      TriggerControlLabelType = 2
+	TriggerControlLabelType_SET_PREFERRED_LANGUAGE TriggerControlLabelType = 3
+)
+
+var TriggerControlLabelTypeValues []TriggerControlLabelType
+
+func init() {
+	_ = errors.New
+	TriggerControlLabelTypeValues = []TriggerControlLabelType{
+		TriggerControlLabelType_TEXT_LABEL,
+		TriggerControlLabelType_PREDEFINED_ICON,
+		TriggerControlLabelType_LOAD_DYNAMIC_ICON,
+		TriggerControlLabelType_SET_PREFERRED_LANGUAGE,
+	}
+}
+
+func TriggerControlLabelTypeByValue(value uint8) (enum TriggerControlLabelType, ok bool) {
+	switch value {
+	case 0:
+		return TriggerControlLabelType_TEXT_LABEL, true
+	case 1:
+		return TriggerControlLabelType_PREDEFINED_ICON, true
+	case 2:
+		return TriggerControlLabelType_LOAD_DYNAMIC_ICON, true
+	case 3:
+		return TriggerControlLabelType_SET_PREFERRED_LANGUAGE, true
+	}
+	return 0, false
+}
+
+func TriggerControlLabelTypeByName(value string) (enum TriggerControlLabelType, ok bool) {
+	switch value {
+	case "TEXT_LABEL":
+		return TriggerControlLabelType_TEXT_LABEL, true
+	case "PREDEFINED_ICON":
+		return TriggerControlLabelType_PREDEFINED_ICON, true
+	case "LOAD_DYNAMIC_ICON":
+		return TriggerControlLabelType_LOAD_DYNAMIC_ICON, true
+	case "SET_PREFERRED_LANGUAGE":
+		return TriggerControlLabelType_SET_PREFERRED_LANGUAGE, true
+	}
+	return 0, false
+}
+
+func TriggerControlLabelTypeKnows(value uint8) bool {
+	for _, typeValue := range TriggerControlLabelTypeValues {
+		if uint8(typeValue) == value {
+			return true
+		}
+	}
+	return false
+}
+
+func CastTriggerControlLabelType(structType interface{}) TriggerControlLabelType {
+	castFunc := func(typ interface{}) TriggerControlLabelType {
+		if sTriggerControlLabelType, ok := typ.(TriggerControlLabelType); ok {
+			return sTriggerControlLabelType
+		}
+		return 0
+	}
+	return castFunc(structType)
+}
+
+func (m TriggerControlLabelType) GetLengthInBits() uint16 {
+	return 2
+}
+
+func (m TriggerControlLabelType) GetLengthInBytes() uint16 {
+	return m.GetLengthInBits() / 8
+}
+
+func TriggerControlLabelTypeParse(readBuffer utils.ReadBuffer) (TriggerControlLabelType, error) {
+	val, err := readBuffer.ReadUint8("TriggerControlLabelType", 2)
+	if err != nil {
+		return 0, errors.Wrap(err, "error reading TriggerControlLabelType")
+	}
+	if enum, ok := TriggerControlLabelTypeByValue(val); !ok {
+		log.Debug().Msgf("no value %x found for RequestType", val)
+		return TriggerControlLabelType(val), nil
+	} else {
+		return enum, nil
+	}
+}
+
+func (e TriggerControlLabelType) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteUint8("TriggerControlLabelType", 2, uint8(e), utils.WithAdditionalStringRepresentation(e.PLC4XEnumName()))
+}
+
+// PLC4XEnumName returns the name that is used in code to identify this enum
+func (e TriggerControlLabelType) PLC4XEnumName() string {
+	switch e {
+	case TriggerControlLabelType_TEXT_LABEL:
+		return "TEXT_LABEL"
+	case TriggerControlLabelType_PREDEFINED_ICON:
+		return "PREDEFINED_ICON"
+	case TriggerControlLabelType_LOAD_DYNAMIC_ICON:
+		return "LOAD_DYNAMIC_ICON"
+	case TriggerControlLabelType_SET_PREFERRED_LANGUAGE:
+		return "SET_PREFERRED_LANGUAGE"
+	}
+	return ""
+}
+
+func (e TriggerControlLabelType) String() string {
+	return e.PLC4XEnumName()
+}
diff --git a/plc4j/drivers/c-bus/src/main/java/org/apache/plc4x/java/cbus/readwrite/utils/StaticHelper.java b/plc4j/drivers/c-bus/src/main/java/org/apache/plc4x/java/cbus/readwrite/utils/StaticHelper.java
index 16a4fa25c..a6f2d123e 100644
--- a/plc4j/drivers/c-bus/src/main/java/org/apache/plc4x/java/cbus/readwrite/utils/StaticHelper.java
+++ b/plc4j/drivers/c-bus/src/main/java/org/apache/plc4x/java/cbus/readwrite/utils/StaticHelper.java
@@ -128,4 +128,15 @@ public class StaticHelper {
         }
     }
 
+    public static boolean knowsTriggerControlCommandTypeContainer(ReadBuffer readBuffer) {
+        int oldPos = readBuffer.getPos();
+        try {
+            return TriggerControlCommandTypeContainer.isDefined(readBuffer.readUnsignedShort(8));
+        } catch (ParseException ignore) {
+            return false;
+        } finally {
+            readBuffer.reset(oldPos);
+        }
+    }
+
 }
diff --git a/plc4j/drivers/c-bus/src/test/java/org/apache/plc4x/java/cbus/ReferenceTest.java b/plc4j/drivers/c-bus/src/test/java/org/apache/plc4x/java/cbus/ReferenceTest.java
index cfc64b0ab..278afed82 100644
--- a/plc4j/drivers/c-bus/src/test/java/org/apache/plc4x/java/cbus/ReferenceTest.java
+++ b/plc4j/drivers/c-bus/src/test/java/org/apache/plc4x/java/cbus/ReferenceTest.java
@@ -936,4 +936,39 @@ public class ReferenceTest {
 
         }
     }
+
+    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/Chapter%2007%20-%20C-Bus%20Trigger%20Control%20Application.pdf
+    @Nested
+    class TriggerControlApplicationsTest{
+
+        //7.12
+        @Nested
+        class Examples{
+            @Test
+            void LocalTrigger() throws Exception {
+                byte[] bytes = "\\05CA0002250109\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions, bytes.length);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+                System.out.println(((RequestCommand) ((CBusMessageToServer) msg).getRequest()).getCbusCommand());
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void RemoteTrigger() throws Exception {
+                byte[] bytes = "\\035609CA022501AC\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions, bytes.length);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+                System.out.println(((RequestCommand) ((CBusMessageToServer) msg).getRequest()).getCbusCommand());
+                assertMessageMatches(bytes, msg);
+            }
+
+        }
+
+    }
 }
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 dcf49e3bd..52167d058 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
@@ -1329,7 +1329,7 @@
             [validation '1==2' "AIR_CONDITIONING Not yet implemented"] // TODO: implement me
         ]
         ['TRIGGER_CONTROL'                      *TriggerControl
-            [validation '1==2' "TRIGGER_CONTROL Not yet implemented"] // TODO: implement me
+            [simple TriggerControlData triggerControlData]
         ]
         ['ENABLE_CONTROL'                       *EnableControl
             [validation '1==2' "ENABLE_CONTROL Not yet implemented"] // TODO: implement me
@@ -1385,7 +1385,7 @@
         ['LABEL'          *Label(LightingCommandTypeContainer commandTypeContainer)
             [simple   byte                  group                                                   ]
             [simple   LightingLabelOptions  labelOptions                                            ]
-            [optional LightingLanguage      language      'labelOptions.labelType != LightingLabelType.LOAD_DYNAMIC_ICON']
+            [optional Language              language      'labelOptions.labelType != LightingLabelType.LOAD_DYNAMIC_ICON']
             [array    byte                  data        count '(commandTypeContainer.numBytes-((labelOptions.labelType != LightingLabelType.LOAD_DYNAMIC_ICON)?(3):(2)))'           ]
         ]
     ]
@@ -1395,16 +1395,16 @@
     [simple   bit                   reservedBit7] // only for dynamic icon loading can switch to 1 (note this could use mspec reserved field but sadly this discards data)
     [simple   LightingLabelFlavour  labelFlavour]
     [reserved bit                   'false'     ]
-    [simple   bit                   reservedBit4] // For Lighting, this bit must be 0 (note this could use mspec reserved field but sadly this discards data)
+    [simple   bit                   reservedBit3] // For Lighting, this bit must be 0 (note this could use mspec reserved field but sadly this discards data)
     [simple   LightingLabelType     labelType   ]
     [simple   bit                   reservedBit0] // For Lighting, this bit must be 0 (note this could use mspec reserved field but sadly this discards data)
 ]
 
 [enum uint 2 LightingLabelFlavour
-    ['0' FLAVOUR_1              ]
-    ['1' FLAVOUR_2              ]
-    ['2' FLAVOUR_3              ]
-    ['3' FLAVOUR_4              ]
+    ['0' FLAVOUR_0              ]
+    ['1' FLAVOUR_1              ]
+    ['2' FLAVOUR_2              ]
+    ['3' FLAVOUR_3              ]
 ]
 
 [enum uint 2 LightingLabelType
@@ -1414,7 +1414,7 @@
     ['3' SET_PREFERRED_LANGUAGE ]
 ]
 
-[enum uint 8 LightingLanguage
+[enum uint 8 Language
     ['0x00' NO_LANGUAGE                 ]
     ['0x01' ENGLISH                     ]
     ['0x02' ENGLISH_AUSTRALIA           ]
@@ -1915,6 +1915,119 @@
     ['0x00' EVENT     ]
 ]
 
+[type TriggerControlData
+    //TODO: golang doesn't like checking for null so we use that static call to check that the enum is known
+    [validation 'STATIC_CALL("knowsTriggerControlCommandTypeContainer", readBuffer)' "no command type could be found" shouldFail=false]
+    [simple  TriggerControlCommandTypeContainer commandTypeContainer                                   ]
+    [virtual TriggerControlCommandType          commandType          'commandTypeContainer.commandType']
+    [simple  byte triggerGroup                                                                         ]
+    [virtual bit  isUnused 'triggerGroup > 0xFE'                                                       ]
+    [typeSwitch commandType
+        ['TRIGGER_EVENT'       *TriggerEvent
+            [simple byte actionSelector]
+        ]
+        ['TRIGGER_MIN'          *TriggerMin
+        ]
+        ['TRIGGER_MAX'          *TriggerMin
+        ]
+        ['INDICATOR_KILL'       *IndicatorKill
+        ]
+        ['LABEL'                *Label(TriggerControlCommandTypeContainer commandTypeContainer)
+           [simple   TriggerControlLabelOptions triggerControlOptions                                   ]
+           [simple   byte                       actionSelector                                          ]
+           [optional Language                   language      'triggerControlOptions.labelType != TriggerControlLabelType.LOAD_DYNAMIC_ICON']
+           [array    byte                       data          count '(commandTypeContainer.numBytes-((triggerControlOptions.labelType != TriggerControlLabelType.LOAD_DYNAMIC_ICON)?(4):(3)))'           ]
+        ]
+    ]
+]
+
+[enum uint 8 TriggerControlCommandTypeContainer(TriggerControlCommandType commandType, uint 5 numBytes)
+    ['0x01' TriggerControlCommandTriggerMin_1Bytes          ['TRIGGER_MIN',     '1']]
+    ['0x09' TriggerControlCommandIndicatorKill_1Bytes       ['INDICATOR_KILL',  '1']]
+    ['0x79' TriggerControlCommandTriggerMax_1Bytes          ['TRIGGER_MAX',     '1']]
+    ['0x02' TriggerControlCommandTriggerEvent0_2Bytes       ['TRIGGER_EVENT',   '2']]
+    ['0x0A' TriggerControlCommandTriggerEvent1_2Bytes       ['TRIGGER_EVENT',   '2']]
+    ['0x12' TriggerControlCommandTriggerEvent2_2Bytes       ['TRIGGER_EVENT',   '2']]
+    ['0x1A' TriggerControlCommandTriggerEvent3_2Bytes       ['TRIGGER_EVENT',   '2']]
+    ['0x22' TriggerControlCommandTriggerEvent4_2Bytes       ['TRIGGER_EVENT',   '2']]
+    ['0x2A' TriggerControlCommandTriggerEvent5_2Bytes       ['TRIGGER_EVENT',   '2']]
+    ['0x32' TriggerControlCommandTriggerEvent6_2Bytes       ['TRIGGER_EVENT',   '2']]
+    ['0x3A' TriggerControlCommandTriggerEvent7_2Bytes       ['TRIGGER_EVENT',   '2']]
+    ['0x42' TriggerControlCommandTriggerEvent8_2Bytes       ['TRIGGER_EVENT',   '2']]
+    ['0x4A' TriggerControlCommandTriggerEvent9_2Bytes       ['TRIGGER_EVENT',   '2']]
+    ['0x52' TriggerControlCommandTriggerEvent10_2Bytes      ['TRIGGER_EVENT',   '2']]
+    ['0x5A' TriggerControlCommandTriggerEvent11_2Bytes      ['TRIGGER_EVENT',   '2']]
+    ['0x62' TriggerControlCommandTriggerEvent12_2Bytes      ['TRIGGER_EVENT',   '2']]
+    ['0x6A' TriggerControlCommandTriggerEvent13_2Bytes      ['TRIGGER_EVENT',   '2']]
+    ['0x72' TriggerControlCommandTriggerEvent14_2Bytes      ['TRIGGER_EVENT',   '2']]
+    ['0x7A' TriggerControlCommandTriggerEvent15_2Bytes      ['TRIGGER_EVENT',   '2']]
+    ['0xA0' TriggerControlCommandLabel_0Bytes               ['LABEL',           '0']]
+    ['0xA1' TriggerControlCommandLabel_1Bytes               ['LABEL',           '1']]
+    ['0xA2' TriggerControlCommandLabel_2Bytes               ['LABEL',           '2']]
+    ['0xA3' TriggerControlCommandLabel_3Bytes               ['LABEL',           '3']]
+    ['0xA4' TriggerControlCommandLabel_4Bytes               ['LABEL',           '4']]
+    ['0xA5' TriggerControlCommandLabel_5Bytes               ['LABEL',           '5']]
+    ['0xA6' TriggerControlCommandLabel_6Bytes               ['LABEL',           '6']]
+    ['0xA7' TriggerControlCommandLabel_7Bytes               ['LABEL',           '7']]
+    ['0xA8' TriggerControlCommandLabel_8Bytes               ['LABEL',           '8']]
+    ['0xA9' TriggerControlCommandLabel_9Bytes               ['LABEL',           '9']]
+    ['0xAA' TriggerControlCommandLabel_10Bytes              ['LABEL',          '10']]
+    ['0xAB' TriggerControlCommandLabel_11Bytes              ['LABEL',          '11']]
+    ['0xAC' TriggerControlCommandLabel_12Bytes              ['LABEL',          '12']]
+    ['0xAD' TriggerControlCommandLabel_13Bytes              ['LABEL',          '13']]
+    ['0xAE' TriggerControlCommandLabel_14Bytes              ['LABEL',          '14']]
+    ['0xAF' TriggerControlCommandLabel_15Bytes              ['LABEL',          '15']]
+    ['0xB0' TriggerControlCommandLabel_16Bytes              ['LABEL',          '16']]
+    ['0xB1' TriggerControlCommandLabel_17Bytes              ['LABEL',          '17']]
+    ['0xB2' TriggerControlCommandLabel_18Bytes              ['LABEL',          '18']]
+    ['0xB3' TriggerControlCommandLabel_19Bytes              ['LABEL',          '19']]
+    ['0xB4' TriggerControlCommandLabel_20Bytes              ['LABEL',          '20']]
+    ['0xB5' TriggerControlCommandLabel_21Bytes              ['LABEL',          '21']]
+    ['0xB6' TriggerControlCommandLabel_22Bytes              ['LABEL',          '22']]
+    ['0xB7' TriggerControlCommandLabel_23Bytes              ['LABEL',          '23']]
+    ['0xB8' TriggerControlCommandLabel_24Bytes              ['LABEL',          '24']]
+    ['0xB9' TriggerControlCommandLabel_25Bytes              ['LABEL',          '25']]
+    ['0xBA' TriggerControlCommandLabel_26Bytes              ['LABEL',          '26']]
+    ['0xBB' TriggerControlCommandLabel_27Bytes              ['LABEL',          '27']]
+    ['0xBC' TriggerControlCommandLabel_28Bytes              ['LABEL',          '28']]
+    ['0xBD' TriggerControlCommandLabel_29Bytes              ['LABEL',          '29']]
+    ['0xBE' TriggerControlCommandLabel_30Bytes              ['LABEL',          '30']]
+    ['0xBF' TriggerControlCommandLabel_31Bytes              ['LABEL',          '31']]
+]
+
+[enum uint 4 TriggerControlCommandType
+    ['0x00' TRIGGER_EVENT   ]
+    ['0x01' TRIGGER_MIN     ]
+    ['0x02' TRIGGER_MAX     ]
+    ['0x03' INDICATOR_KILL  ]
+    ['0x04' LABEL           ]
+]
+
+// TODO: maybe can be merged with lightning labels
+[type TriggerControlLabelOptions
+    [simple   bit                           reservedBit7] // only for dynamic icon loading can switch to 1 (note this could use mspec reserved field but sadly this discards data)
+    [simple   TriggerControlLabelFlavour    labelFlavour]
+    [reserved bit                           'false'     ]
+    [simple   bit                           reservedBit3] // For Control Trigger, this bit must be 0 (note this could use mspec reserved field but sadly this discards data)
+    [simple   TriggerControlLabelType       labelType   ]
+    [simple   bit                           reservedBit0] // For Control Trigger, this bit must be 1 (note this could use mspec reserved field but sadly this discards data)
+]
+
+// TODO: maybe can be merged with lightning labels
+[enum uint 2 TriggerControlLabelFlavour
+    ['0' FLAVOUR_0              ]
+    ['1' FLAVOUR_1              ]
+    ['2' FLAVOUR_2              ]
+    ['3' FLAVOUR_3              ]
+]
+
+[enum uint 2 TriggerControlLabelType
+    ['0' TEXT_LABEL             ]
+    ['1' PREDEFINED_ICON        ]
+    ['2' LOAD_DYNAMIC_ICON      ]
+    ['3' SET_PREFERRED_LANGUAGE ]
+]
+
 [type ReplyOrConfirmation(CBusOptions cBusOptions, uint 16 messageLength, RequestContext requestContext)
     [peek    byte peekedByte                                                ]
     [virtual bit  isAlpha '(peekedByte >= 0x67) && (peekedByte <= 0x7A)'    ]