Skip to content

Commit 446f3c7

Browse files
Fix Current limits not reporting proper values (#87)
ElectricalConnectionParameterDescription data also may contain power values per phase. To get the current values, the MeasurementDescription data needs to be evaluated and proper measurementIds passed over to filter the parameter data properly
2 parents 4032f49 + 159ba13 commit 446f3c7

11 files changed

+226
-66
lines changed

api/features.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ type ElectricalConnectionCommonInterface interface {
114114
float64, float64, float64, error)
115115

116116
// Get the min, max, default current limits for each phase
117-
GetPhaseCurrentLimits() (
117+
GetPhaseCurrentLimits(measDesc []model.MeasurementDescriptionDataType) (
118118
resultMin []float64, resultMax []float64, resultDefault []float64, resultErr error)
119119

120120
// Adjust a value to be within the permitted value range

features/internal/electricalconnection.go

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -176,33 +176,52 @@ var PhaseNameMapping = []model.ElectricalConnectionPhaseNameType{
176176
model.ElectricalConnectionPhaseNameTypeC}
177177

178178
// Get the min, max, default current limits for each phase
179-
func (e *ElectricalConnectionCommon) GetPhaseCurrentLimits() (
179+
func (e *ElectricalConnectionCommon) GetPhaseCurrentLimits(measurementDescs []model.MeasurementDescriptionDataType) (
180180
resultMin []float64, resultMax []float64, resultDefault []float64, resultErr error) {
181181
for _, phaseName := range PhaseNameMapping {
182182
// electricalParameterDescription contains the measured phase for each measurementId
183183
filter := model.ElectricalConnectionParameterDescriptionDataType{
184184
AcMeasuredPhases: util.Ptr(phaseName),
185185
}
186186
elParamDesc, err := e.GetParameterDescriptionsForFilter(filter)
187-
if err != nil || len(elParamDesc) != 1 || elParamDesc[0].ParameterId == nil {
187+
if err != nil || len(elParamDesc) == 0 {
188188
continue
189189
}
190190

191-
filter1 := model.ElectricalConnectionPermittedValueSetDataType{
192-
ParameterId: elParamDesc[0].ParameterId,
193-
}
194-
dataMin, dataMax, dataDefault, err := e.GetPermittedValueDataForFilter(filter1)
195-
if err != nil {
196-
continue
197-
}
191+
// check all params and assume there are no phase specific power limits
192+
for _, paramEl := range elParamDesc {
193+
if paramEl.ParameterId == nil || paramEl.MeasurementId == nil {
194+
continue
195+
}
196+
197+
// check if the measurementId is in measurementDescs
198+
found := false
199+
for _, mDesc := range measurementDescs {
200+
if mDesc.MeasurementId != nil && *mDesc.MeasurementId == *paramEl.MeasurementId {
201+
found = true
202+
break
203+
}
204+
}
205+
if !found {
206+
continue
207+
}
208+
209+
filter1 := model.ElectricalConnectionPermittedValueSetDataType{
210+
ParameterId: paramEl.ParameterId,
211+
}
212+
dataMin, dataMax, dataDefault, err := e.GetPermittedValueDataForFilter(filter1)
213+
if err != nil {
214+
continue
215+
}
198216

199-
// Min current data should be derived from min power data
200-
// but as this value is only properly provided via VAS the
201-
// currrent min values can not be trusted.
217+
// Min current data should be derived from min power data
218+
// but as this value is only properly provided via VAS the
219+
// currrent min values can not be trusted.
202220

203-
resultMin = append(resultMin, dataMin)
204-
resultMax = append(resultMax, dataMax)
205-
resultDefault = append(resultDefault, dataDefault)
221+
resultMin = append(resultMin, dataMin)
222+
resultMax = append(resultMax, dataMax)
223+
resultDefault = append(resultDefault, dataDefault)
224+
}
206225
}
207226

208227
if len(resultMin) == 0 {

features/internal/electricalconnection_test.go

Lines changed: 50 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ type ElectricalConnectionSuite struct {
2323
localEntity spineapi.EntityLocalInterface
2424
remoteEntity spineapi.EntityRemoteInterface
2525

26-
localFeature spineapi.FeatureLocalInterface
27-
remoteFeature spineapi.FeatureRemoteInterface
26+
localFeature, localMeasFeature spineapi.FeatureLocalInterface
27+
remoteFeature, remoteMeasFeature spineapi.FeatureRemoteInterface
2828

2929
localSut,
3030
remoteSut *internal.ElectricalConnectionCommon
@@ -47,18 +47,28 @@ func (s *ElectricalConnectionSuite) BeforeTest(suiteName, testName string) {
4747
model.FunctionTypeElectricalConnectionCharacteristicListData,
4848
},
4949
},
50+
{
51+
featureType: model.FeatureTypeTypeMeasurement,
52+
functions: []model.FunctionType{
53+
model.FunctionTypeMeasurementDescriptionListData,
54+
},
55+
},
5056
},
5157
)
5258

5359
s.localFeature = s.localEntity.FeatureOfTypeAndRole(model.FeatureTypeTypeElectricalConnection, model.RoleTypeServer)
5460
assert.NotNil(s.T(), s.localFeature)
5561
s.localSut = internal.NewLocalElectricalConnection(s.localFeature)
5662
assert.NotNil(s.T(), s.localSut)
63+
s.localMeasFeature = s.localEntity.FeatureOfTypeAndRole(model.FeatureTypeTypeMeasurement, model.RoleTypeServer)
64+
assert.NotNil(s.T(), s.localMeasFeature)
5765

5866
s.remoteFeature = s.remoteEntity.FeatureOfTypeAndRole(model.FeatureTypeTypeElectricalConnection, model.RoleTypeServer)
5967
assert.NotNil(s.T(), s.remoteFeature)
6068
s.remoteSut = internal.NewRemoteElectricalConnection(s.remoteFeature)
6169
assert.NotNil(s.T(), s.remoteSut)
70+
s.remoteMeasFeature = s.remoteEntity.FeatureOfTypeAndRole(model.FeatureTypeTypeMeasurement, model.RoleTypeServer)
71+
assert.NotNil(s.T(), s.remoteMeasFeature)
6272
}
6373

6474
func (s *ElectricalConnectionSuite) Test_CheckEventPayloadDataForFilter() {
@@ -612,34 +622,34 @@ func (s *ElectricalConnectionSuite) Test_GetCharacteristicForContextType() {
612622
}
613623

614624
func (s *ElectricalConnectionSuite) Test_EVCurrentLimits() {
615-
minData, maxData, defaultData, err := s.localSut.GetPhaseCurrentLimits()
625+
minData, maxData, defaultData, err := s.localSut.GetPhaseCurrentLimits(nil)
616626
assert.NotNil(s.T(), err)
617627
assert.Nil(s.T(), minData)
618628
assert.Nil(s.T(), maxData)
619629
assert.Nil(s.T(), defaultData)
620-
minData, maxData, defaultData, err = s.remoteSut.GetPhaseCurrentLimits()
630+
minData, maxData, defaultData, err = s.remoteSut.GetPhaseCurrentLimits(nil)
621631
assert.NotNil(s.T(), err)
622632
assert.Nil(s.T(), minData)
623633
assert.Nil(s.T(), maxData)
624634
assert.Nil(s.T(), defaultData)
625635

626-
minData, maxData, defaultData, err = s.localSut.GetPhaseCurrentLimits()
636+
minData, maxData, defaultData, err = s.localSut.GetPhaseCurrentLimits(nil)
627637
assert.NotNil(s.T(), err)
628638
assert.Nil(s.T(), minData)
629639
assert.Nil(s.T(), maxData)
630640
assert.Nil(s.T(), defaultData)
631-
minData, maxData, defaultData, err = s.remoteSut.GetPhaseCurrentLimits()
641+
minData, maxData, defaultData, err = s.remoteSut.GetPhaseCurrentLimits(nil)
632642
assert.NotNil(s.T(), err)
633643
assert.Nil(s.T(), minData)
634644
assert.Nil(s.T(), maxData)
635645
assert.Nil(s.T(), defaultData)
636646

637-
minData, maxData, defaultData, err = s.localSut.GetPhaseCurrentLimits()
647+
minData, maxData, defaultData, err = s.localSut.GetPhaseCurrentLimits(nil)
638648
assert.NotNil(s.T(), err)
639649
assert.Nil(s.T(), minData)
640650
assert.Nil(s.T(), maxData)
641651
assert.Nil(s.T(), defaultData)
642-
minData, maxData, defaultData, err = s.remoteSut.GetPhaseCurrentLimits()
652+
minData, maxData, defaultData, err = s.remoteSut.GetPhaseCurrentLimits(nil)
643653
assert.NotNil(s.T(), err)
644654
assert.Nil(s.T(), minData)
645655
assert.Nil(s.T(), maxData)
@@ -673,18 +683,46 @@ func (s *ElectricalConnectionSuite) Test_EVCurrentLimits() {
673683
fErr = s.remoteFeature.UpdateData(model.FunctionTypeElectricalConnectionParameterDescriptionListData, paramData, nil, nil)
674684
assert.Nil(s.T(), fErr)
675685

676-
minData, maxData, defaultData, err = s.localSut.GetPhaseCurrentLimits()
686+
minData, maxData, defaultData, err = s.localSut.GetPhaseCurrentLimits(nil)
677687
assert.NotNil(s.T(), err)
678688
assert.Nil(s.T(), minData)
679689
assert.Nil(s.T(), maxData)
680690
assert.Nil(s.T(), defaultData)
681691

682-
minData, maxData, defaultData, err = s.remoteSut.GetPhaseCurrentLimits()
692+
minData, maxData, defaultData, err = s.remoteSut.GetPhaseCurrentLimits(nil)
683693
assert.NotNil(s.T(), err)
684694
assert.Nil(s.T(), minData)
685695
assert.Nil(s.T(), maxData)
686696
assert.Nil(s.T(), defaultData)
687697

698+
measData := &model.MeasurementDescriptionListDataType{
699+
MeasurementDescriptionData: []model.MeasurementDescriptionDataType{
700+
{
701+
MeasurementId: util.Ptr(model.MeasurementIdType(0)),
702+
MeasurementType: util.Ptr(model.MeasurementTypeTypeCurrent),
703+
CommodityType: util.Ptr(model.CommodityTypeTypeElectricity),
704+
Unit: util.Ptr(model.UnitOfMeasurementTypeA),
705+
ScopeType: util.Ptr(model.ScopeTypeTypeACCurrent),
706+
},
707+
{
708+
MeasurementId: util.Ptr(model.MeasurementIdType(1)),
709+
MeasurementType: util.Ptr(model.MeasurementTypeTypeCurrent),
710+
CommodityType: util.Ptr(model.CommodityTypeTypeElectricity),
711+
Unit: util.Ptr(model.UnitOfMeasurementTypeA),
712+
ScopeType: util.Ptr(model.ScopeTypeTypeACCurrent)},
713+
{
714+
MeasurementId: util.Ptr(model.MeasurementIdType(2)),
715+
MeasurementType: util.Ptr(model.MeasurementTypeTypeCurrent),
716+
CommodityType: util.Ptr(model.CommodityTypeTypeElectricity),
717+
Unit: util.Ptr(model.UnitOfMeasurementTypeA),
718+
ScopeType: util.Ptr(model.ScopeTypeTypeACCurrent)},
719+
},
720+
}
721+
fErr = s.localMeasFeature.UpdateData(model.FunctionTypeMeasurementDescriptionListData, measData, nil, nil)
722+
assert.Nil(s.T(), fErr)
723+
fErr = s.remoteMeasFeature.UpdateData(model.FunctionTypeMeasurementDescriptionListData, measData, nil, nil)
724+
assert.Nil(s.T(), fErr)
725+
688726
type permittedStruct struct {
689727
defaultExists bool
690728
defaultValue, expectedDefaultValue float64
@@ -775,7 +813,7 @@ func (s *ElectricalConnectionSuite) Test_EVCurrentLimits() {
775813
fErr = s.remoteFeature.UpdateData(model.FunctionTypeElectricalConnectionPermittedValueSetListData, permData, nil, nil)
776814
assert.Nil(s.T(), fErr)
777815

778-
minData, maxData, defaultData, err = s.localSut.GetPhaseCurrentLimits()
816+
minData, maxData, defaultData, err = s.localSut.GetPhaseCurrentLimits(measData.MeasurementDescriptionData)
779817
assert.Nil(s.T(), err)
780818

781819
assert.Equal(s.T(), len(tc.permitted), len(minData))
@@ -787,7 +825,7 @@ func (s *ElectricalConnectionSuite) Test_EVCurrentLimits() {
787825
assert.Equal(s.T(), item.expectedDefaultValue, defaultData[index])
788826
}
789827

790-
minData, maxData, defaultData, err = s.remoteSut.GetPhaseCurrentLimits()
828+
minData, maxData, defaultData, err = s.remoteSut.GetPhaseCurrentLimits(measData.MeasurementDescriptionData)
791829
assert.Nil(s.T(), err)
792830

793831
assert.Equal(s.T(), len(tc.permitted), len(minData))

mocks/ElectricalConnectionCommonInterface.go

Lines changed: 19 additions & 18 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mocks/ElectricalConnectionServerInterface.go

Lines changed: 19 additions & 18 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)