-
Notifications
You must be signed in to change notification settings - Fork 13
/
function_data_factory.go
301 lines (264 loc) · 18.7 KB
/
function_data_factory.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
package spine
import (
"fmt"
"github.com/enbility/eebus-go/spine/model"
)
func CreateFunctionData[F any](featureType model.FeatureTypeType) []F {
if featureType == model.FeatureTypeTypeNodeManagement {
return []F{} // NodeManagement implementation is not using function data
}
// Some devices use generic for everything (e.g. Vaillant Arotherm heatpump)
// or for some things like the SMA HM 2.0 or Elli Wallbox, which uses Generic feature
// for Heartbeats, even though that should go into FeatureTypeTypeDeviceDiagnosis
// Hence we add everything to the Generic feature, as we don't know what might be needed
var result []F
if featureType == model.FeatureTypeTypeActuatorLevel || featureType == model.FeatureTypeTypeGeneric {
result = append(result, []F{
createFunctionData[model.ActuatorLevelDataType, F](model.FunctionTypeActuatorLevelData),
createFunctionData[model.ActuatorLevelDescriptionDataType, F](model.FunctionTypeActuatorLevelDescriptionData),
}...)
}
if featureType == model.FeatureTypeTypeActuatorSwitch || featureType == model.FeatureTypeTypeGeneric {
result = append(result, []F{
createFunctionData[model.ActuatorSwitchDataType, F](model.FunctionTypeActuatorSwitchData),
createFunctionData[model.ActuatorSwitchDescriptionDataType, F](model.FunctionTypeActuatorSwitchDescriptionData),
}...)
}
if featureType == model.FeatureTypeTypeAlarm || featureType == model.FeatureTypeTypeGeneric {
result = append(result, []F{
createFunctionData[model.AlarmListDataType, F](model.FunctionTypeAlarmListData),
}...)
}
if featureType == model.FeatureTypeTypeBill || featureType == model.FeatureTypeTypeGeneric {
result = append(result, []F{
createFunctionData[model.BillDescriptionListDataType, F](model.FunctionTypeBillDescriptionListData),
createFunctionData[model.BillConstraintsListDataType, F](model.FunctionTypeBillConstraintsListData),
createFunctionData[model.BillListDataType, F](model.FunctionTypeBillListData),
}...)
}
if featureType == model.FeatureTypeTypeDataTunneling || featureType == model.FeatureTypeTypeGeneric {
result = append(result, []F{
createFunctionData[model.DataTunnelingCallType, F](model.FunctionTypeDataTunnelingCall),
}...)
}
if featureType == model.FeatureTypeTypeDeviceClassification || featureType == model.FeatureTypeTypeGeneric {
result = append(result, []F{
createFunctionData[model.DeviceClassificationManufacturerDataType, F](model.FunctionTypeDeviceClassificationManufacturerData),
createFunctionData[model.DeviceClassificationUserDataType, F](model.FunctionTypeDeviceClassificationUserData),
}...)
}
if featureType == model.FeatureTypeTypeDeviceConfiguration || featureType == model.FeatureTypeTypeGeneric {
result = append(result, []F{
createFunctionData[model.DeviceConfigurationKeyValueConstraintsListDataType, F](model.FunctionTypeDeviceConfigurationKeyValueConstraintsListData),
createFunctionData[model.DeviceConfigurationKeyValueDescriptionListDataType, F](model.FunctionTypeDeviceConfigurationKeyValueDescriptionListData),
createFunctionData[model.DeviceConfigurationKeyValueListDataType, F](model.FunctionTypeDeviceConfigurationKeyValueListData),
}...)
}
if featureType == model.FeatureTypeTypeDeviceDiagnosis || featureType == model.FeatureTypeTypeGeneric {
result = append(result, []F{
createFunctionData[model.DeviceDiagnosisStateDataType, F](model.FunctionTypeDeviceDiagnosisStateData),
createFunctionData[model.DeviceDiagnosisHeartbeatDataType, F](model.FunctionTypeDeviceDiagnosisHeartbeatData),
createFunctionData[model.DeviceDiagnosisServiceDataType, F](model.FunctionTypeDeviceDiagnosisServiceData),
}...)
}
if featureType == model.FeatureTypeTypeDirectControl || featureType == model.FeatureTypeTypeGeneric {
result = append(result, []F{
createFunctionData[model.DirectControlActivityListDataType, F](model.FunctionTypeDirectControlActivityListData),
createFunctionData[model.DirectControlDescriptionDataType, F](model.FunctionTypeDirectControlDescriptionData),
}...)
}
if featureType == model.FeatureTypeTypeElectricalConnection || featureType == model.FeatureTypeTypeGeneric {
result = append(result, []F{
createFunctionData[model.ElectricalConnectionDescriptionListDataType, F](model.FunctionTypeElectricalConnectionDescriptionListData),
createFunctionData[model.ElectricalConnectionParameterDescriptionListDataType, F](model.FunctionTypeElectricalConnectionParameterDescriptionListData),
createFunctionData[model.ElectricalConnectionPermittedValueSetListDataType, F](model.FunctionTypeElectricalConnectionPermittedValueSetListData),
createFunctionData[model.ElectricalConnectionStateListDataType, F](model.FunctionTypeElectricalConnectionStateListData),
}...)
}
if featureType == model.FeatureTypeTypeHvac || featureType == model.FeatureTypeTypeGeneric {
result = append(result, []F{
createFunctionData[model.HvacOperationModeDescriptionDataType, F](model.FunctionTypeHvacOperationModeDescriptionListData),
createFunctionData[model.HvacOverrunDescriptionListDataType, F](model.FunctionTypeHvacOverrunDescriptionListData),
createFunctionData[model.HvacOverrunListDataType, F](model.FunctionTypeHvacOverrunListData),
createFunctionData[model.HvacSystemFunctionDescriptionDataType, F](model.FunctionTypeHvacSystemFunctionDescriptionListData),
createFunctionData[model.HvacSystemFunctionListDataType, F](model.FunctionTypeHvacSystemFunctionListData),
createFunctionData[model.HvacSystemFunctionOperationModeRelationListDataType, F](model.FunctionTypeHvacSystemFunctionOperationModeRelationListData),
createFunctionData[model.HvacSystemFunctionPowerSequenceRelationListDataType, F](model.FunctionTypeHvacSystemFunctionPowerSequenceRelationListData),
createFunctionData[model.HvacSystemFunctionSetpointRelationListDataType, F](model.FunctionTypeHvacSystemFunctionSetPointRelationListData),
}...)
}
if featureType == model.FeatureTypeTypeIdentification || featureType == model.FeatureTypeTypeGeneric {
result = append(result, []F{
createFunctionData[model.IdentificationListDataType, F](model.FunctionTypeIdentificationListData),
}...)
}
if featureType == model.FeatureTypeTypeIncentiveTable || featureType == model.FeatureTypeTypeGeneric {
result = append(result, []F{
createFunctionData[model.IncentiveTableDescriptionDataType, F](model.FunctionTypeIncentiveTableDescriptionData),
createFunctionData[model.IncentiveTableConstraintsDataType, F](model.FunctionTypeIncentiveTableConstraintsData),
createFunctionData[model.IncentiveTableDataType, F](model.FunctionTypeIncentiveTableData),
}...)
}
if featureType == model.FeatureTypeTypeLoadControl || featureType == model.FeatureTypeTypeGeneric {
result = append(result, []F{
createFunctionData[model.LoadControlEventListDataType, F](model.FunctionTypeLoadControlEventListData),
createFunctionData[model.LoadControlLimitConstraintsListDataType, F](model.FunctionTypeLoadControlLimitConstraintsListData),
createFunctionData[model.LoadControlLimitDescriptionListDataType, F](model.FunctionTypeLoadControlLimitDescriptionListData),
createFunctionData[model.LoadControlLimitListDataType, F](model.FunctionTypeLoadControlLimitListData),
createFunctionData[model.LoadControlNodeDataType, F](model.FunctionTypeLoadControlNodeData),
createFunctionData[model.LoadControlStateListDataType, F](model.FunctionTypeLoadControlStateListData),
}...)
}
if featureType == model.FeatureTypeTypeMeasurement || featureType == model.FeatureTypeTypeGeneric {
result = append(result, []F{
createFunctionData[model.MeasurementListDataType, F](model.FunctionTypeMeasurementListData),
createFunctionData[model.MeasurementDescriptionListDataType, F](model.FunctionTypeMeasurementDescriptionListData),
createFunctionData[model.MeasurementConstraintsListDataType, F](model.FunctionTypeMeasurementConstraintsListData),
createFunctionData[model.MeasurementThresholdRelationListDataType, F](model.FunctionTypeMeasurementThresholdRelationListData),
}...)
}
if featureType == model.FeatureTypeTypeMessaging || featureType == model.FeatureTypeTypeGeneric {
result = append(result, []F{
createFunctionData[model.MessagingListDataType, F](model.FunctionTypeMessagingListData),
}...)
}
if featureType == model.FeatureTypeTypeNetworkManagement || featureType == model.FeatureTypeTypeGeneric {
result = append(result, []F{
createFunctionData[model.NetworkManagementAbortCallType, F](model.FunctionTypeNetworkManagementAbortCall),
createFunctionData[model.NetworkManagementAddNodeCallType, F](model.FunctionTypeNetworkManagementAddNodeCall),
createFunctionData[model.NetworkManagementDeviceDescriptionListDataType, F](model.FunctionTypeNetworkManagementDeviceDescriptionListData),
createFunctionData[model.NetworkManagementDiscoverCallType, F](model.FunctionTypeNetworkManagementDiscoverCall),
createFunctionData[model.NetworkManagementEntityDescriptionListDataType, F](model.FunctionTypeNetworkManagementEntityDescriptionListData),
createFunctionData[model.NetworkManagementFeatureDescriptionListDataType, F](model.FunctionTypeNetworkManagementFeatureDescriptionListData),
createFunctionData[model.NetworkManagementJoiningModeDataType, F](model.FunctionTypeNetworkManagementJoiningModeData),
createFunctionData[model.NetworkManagementModifyNodeCallType, F](model.FunctionTypeNetworkManagementModifyNodeCall),
createFunctionData[model.NetworkManagementProcessStateDataType, F](model.FunctionTypeNetworkManagementProcessStateData),
createFunctionData[model.NetworkManagementRemoveNodeCallType, F](model.FunctionTypeNetworkManagementRemoveNodeCall),
createFunctionData[model.NetworkManagementReportCandidateDataType, F](model.FunctionTypeNetworkManagementReportCandidateData),
createFunctionData[model.NetworkManagementScanNetworkCallType, F](model.FunctionTypeNetworkManagementScanNetworkCall),
}...)
}
if featureType == model.FeatureTypeTypeOperatingConstraints || featureType == model.FeatureTypeTypeGeneric {
result = append(result, []F{
createFunctionData[model.OperatingConstraintsDurationListDataType, F](model.FunctionTypeOperatingConstraintsDurationListData),
createFunctionData[model.OperatingConstraintsInterruptListDataType, F](model.FunctionTypeOperatingConstraintsInterruptListData),
createFunctionData[model.OperatingConstraintsPowerDescriptionListDataType, F](model.FunctionTypeOperatingConstraintsPowerDescriptionListData),
createFunctionData[model.OperatingConstraintsPowerLevelListDataType, F](model.FunctionTypeOperatingConstraintsPowerLevelListData),
createFunctionData[model.OperatingConstraintsPowerRangeListDataType, F](model.FunctionTypeOperatingConstraintsPowerRangeListData),
createFunctionData[model.OperatingConstraintsResumeImplicationListDataType, F](model.FunctionTypeOperatingConstraintsResumeImplicationListData),
}...)
}
if featureType == model.FeatureTypeTypePowerSequences || featureType == model.FeatureTypeTypeGeneric {
result = append(result, []F{
createFunctionData[model.PowerSequenceAlternativesRelationListDataType, F](model.FunctionTypePowerSequenceAlternativesRelationListData),
createFunctionData[model.PowerSequenceDescriptionListDataType, F](model.FunctionTypePowerSequenceDescriptionListData),
createFunctionData[model.PowerSequenceNodeScheduleInformationDataType, F](model.FunctionTypePowerSequenceNodeScheduleInformationData),
createFunctionData[model.PowerSequencePriceCalculationRequestCallType, F](model.FunctionTypePowerSequencePriceCalculationRequestCall),
createFunctionData[model.PowerSequencePriceListDataType, F](model.FunctionTypePowerSequencePriceListData),
createFunctionData[model.PowerSequenceScheduleConfigurationRequestCallType, F](model.FunctionTypePowerSequenceScheduleConfigurationRequestCall),
createFunctionData[model.PowerSequenceScheduleConstraintsListDataType, F](model.FunctionTypePowerSequenceScheduleConstraintsListData),
createFunctionData[model.PowerSequenceScheduleListDataType, F](model.FunctionTypePowerSequenceScheduleListData),
createFunctionData[model.PowerSequenceSchedulePreferenceListDataType, F](model.FunctionTypePowerSequenceSchedulePreferenceListData),
createFunctionData[model.PowerSequenceStateListDataType, F](model.FunctionTypePowerSequenceStateListData),
createFunctionData[model.PowerTimeSlotScheduleConstraintsListDataType, F](model.FunctionTypePowerTimeSlotScheduleConstraintsListData),
createFunctionData[model.PowerTimeSlotScheduleListDataType, F](model.FunctionTypePowerTimeSlotScheduleListData),
createFunctionData[model.PowerTimeSlotValueListDataType, F](model.FunctionTypePowerTimeSlotValueListData),
}...)
}
if featureType == model.FeatureTypeTypeSensing || featureType == model.FeatureTypeTypeGeneric {
result = append(result, []F{
createFunctionData[model.SensingDescriptionDataType, F](model.FunctionTypeSensingDescriptionData),
createFunctionData[model.SensingListDataType, F](model.FunctionTypeSensingListData),
}...)
}
if featureType == model.FeatureTypeTypeSetpoint || featureType == model.FeatureTypeTypeGeneric {
result = append(result, []F{
createFunctionData[model.SetpointConstraintsListDataType, F](model.FunctionTypeSetpointConstraintsListData),
createFunctionData[model.SetpointDescriptionListDataType, F](model.FunctionTypeSetpointDescriptionListData),
createFunctionData[model.SetpointListDataType, F](model.FunctionTypeSetpointListData),
}...)
}
if featureType == model.FeatureTypeTypeSmartEnergyManagementPs || featureType == model.FeatureTypeTypeGeneric {
result = append(result, []F{
createFunctionData[model.SmartEnergyManagementPsConfigurationRequestCallType, F](model.FunctionTypeSmartEnergyManagementPsConfigurationRequestCall),
createFunctionData[model.SmartEnergyManagementPsDataType, F](model.FunctionTypeSmartEnergyManagementPsData),
createFunctionData[model.SmartEnergyManagementPsPriceCalculationRequestCallType, F](model.FunctionTypeSmartEnergyManagementPsPriceCalculationRequestCall),
createFunctionData[model.SmartEnergyManagementPsPriceDataType, F](model.FunctionTypeSmartEnergyManagementPsPriceData),
}...)
}
if featureType == model.FeatureTypeTypeSupplyCondition || featureType == model.FeatureTypeTypeGeneric {
result = append(result, []F{
createFunctionData[model.SupplyConditionDescriptionListDataType, F](model.FunctionTypeSupplyConditionDescriptionListData),
createFunctionData[model.SupplyConditionListDataType, F](model.FunctionTypeSupplyConditionListData),
createFunctionData[model.SupplyConditionThresholdRelationListDataType, F](model.FunctionTypeSupplyConditionThresholdRelationListData),
}...)
}
if featureType == model.FeatureTypeTypeTariffInformation || featureType == model.FeatureTypeTypeGeneric {
result = append(result, []F{
createFunctionData[model.IncentiveDescriptionListDataType, F](model.FunctionTypeIncentiveDescriptionListData),
createFunctionData[model.IncentiveListDataType, F](model.FunctionTypeIncentiveListData),
createFunctionData[model.TariffBoundaryRelationListDataType, F](model.FunctionTypeTariffBoundaryRelationListData),
createFunctionData[model.TariffDescriptionListDataType, F](model.FunctionTypeTariffDescriptionListData),
createFunctionData[model.TariffListDataType, F](model.FunctionTypeTariffListData),
createFunctionData[model.TariffOverallConstraintsDataType, F](model.FunctionTypeTariffOverallConstraintsData),
createFunctionData[model.TariffTierRelationListDataType, F](model.FunctionTypeTariffTierRelationListData),
createFunctionData[model.TierBoundaryDescriptionListDataType, F](model.FunctionTypeTierBoundaryDescriptionListData),
createFunctionData[model.TierBoundaryListDataType, F](model.FunctionTypeTierBoundaryListData),
createFunctionData[model.TierDescriptionListDataType, F](model.FunctionTypeTierDescriptionListData),
createFunctionData[model.TierIncentiveRelationListDataType, F](model.FunctionTypeTierIncentiveRelationListData),
createFunctionData[model.TierListDataType, F](model.FunctionTypeTierListData),
}...)
}
if featureType == model.FeatureTypeTypeTaskManagement || featureType == model.FeatureTypeTypeGeneric {
result = append(result, []F{
createFunctionData[model.TaskManagementJobDescriptionListDataType, F](model.FunctionTypeTaskManagementJobDescriptionListData),
createFunctionData[model.TaskManagementJobListDataType, F](model.FunctionTypeTaskManagementJobListData),
createFunctionData[model.TaskManagementJobRelationListDataType, F](model.FunctionTypeTaskManagementJobRelationListData),
createFunctionData[model.TaskManagementOverviewDataType, F](model.FunctionTypeTaskManagementOverviewData),
}...)
}
if featureType == model.FeatureTypeTypeThreshold || featureType == model.FeatureTypeTypeGeneric {
result = append(result, []F{
createFunctionData[model.ThresholdConstraintsListDataType, F](model.FunctionTypeThresholdConstraintsListData),
createFunctionData[model.ThresholdDescriptionListDataType, F](model.FunctionTypeThresholdDescriptionListData),
createFunctionData[model.ThresholdListDataType, F](model.FunctionTypeThresholdListData),
}...)
}
if featureType == model.FeatureTypeTypeTimeInformation || featureType == model.FeatureTypeTypeGeneric {
result = append(result, []F{
createFunctionData[model.TimeDistributorDataType, F](model.FunctionTypeTimeDistributorData),
createFunctionData[model.TimeDistributorEnquiryCallType, F](model.FunctionTypeTimeDistributorEnquiryCall),
createFunctionData[model.TimeInformationDataType, F](model.FunctionTypeTimeInformationData),
createFunctionData[model.TimePrecisionDataType, F](model.FunctionTypeTimePrecisionData),
}...)
}
if featureType == model.FeatureTypeTypeTimeSeries || featureType == model.FeatureTypeTypeGeneric {
result = append(result, []F{
createFunctionData[model.TimeSeriesDescriptionListDataType, F](model.FunctionTypeTimeSeriesDescriptionListData),
createFunctionData[model.TimeSeriesConstraintsListDataType, F](model.FunctionTypeTimeSeriesConstraintsListData),
createFunctionData[model.TimeSeriesListDataType, F](model.FunctionTypeTimeSeriesListData),
}...)
}
if featureType == model.FeatureTypeTypeTimeTable || featureType == model.FeatureTypeTypeGeneric {
result = append(result, []F{
createFunctionData[model.TimeTableConstraintsListDataType, F](model.FunctionTypeTimeTableConstraintsListData),
createFunctionData[model.TimeTableDescriptionListDataType, F](model.FunctionTypeTimeTableDescriptionListData),
createFunctionData[model.TimeTableListDataType, F](model.FunctionTypeTimeTableListData),
}...)
}
if len(result) == 0 {
panic(fmt.Errorf("unknown featureType '%s'", featureType))
}
return result
}
func createFunctionData[T any, F any](functionType model.FunctionType) F {
x := any(new(F))
switch x.(type) {
case *FunctionDataCmd:
return any(NewFunctionDataCmd[T](functionType)).(F)
case *FunctionData:
return any(NewFunctionData[T](functionType)).(F)
default:
panic(fmt.Errorf("only FunctionData and FunctionDataCmd are supported"))
}
}