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