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  }