Skip to content

Commit be26ec7

Browse files
committed
Add OpEV test for Elli Gen1 EVSE data issue
1 parent b851a17 commit be26ec7

File tree

2 files changed

+220
-1
lines changed

2 files changed

+220
-1
lines changed

usecases/internal/loadcontrol.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ func LoadControlLimits(
8585
// according to OpEV Spec 1.0.1b, page 30: "At least one set of permitted values SHALL be stated."
8686
// which is not the case for all elements for this EVSE setup
8787
// but we have to ignore this case and continue with the next phase
88+
89+
// In addition Elli Conenct/Pro (Gen1) returns no or empty PermittedValueSet data
8890
continue
8991
}
9092

usecases/internal/loadcontrol_test.go

Lines changed: 218 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ func (s *InternalSuite) Test_LoadControlLimits_Bender_1Phase() {
309309
assert.Nil(s.T(), data)
310310
assert.Equal(s.T(), 0, len(data))
311311

312-
// according to OPeV Spec 1.0.1b, page 30: "At least one set of permitted values SHALL be stated."
312+
// according to OpEV Spec 1.0.1b, page 30: "At least one set of permitted values SHALL be stated."
313313
// which is not the case here for all elements
314314
permData := &model.ElectricalConnectionPermittedValueSetListDataType{
315315
ElectricalConnectionPermittedValueSetData: []model.ElectricalConnectionPermittedValueSetDataType{
@@ -364,6 +364,223 @@ func (s *InternalSuite) Test_LoadControlLimits_Bender_1Phase() {
364364
assert.Equal(s.T(), 16.0, data[0].Value)
365365
}
366366

367+
func (s *InternalSuite) Test_LoadControlLimits_Elli_1Phase() {
368+
var data []ucapi.LoadLimitsPhase
369+
var err error
370+
limitType := model.LoadControlLimitTypeTypeMaxValueLimit
371+
scope := model.ScopeTypeTypeOverloadProtection
372+
scopeSelf := model.ScopeTypeTypeSelfConsumption
373+
category := model.LoadControlCategoryTypeObligation
374+
categoryRec := model.LoadControlCategoryTypeRecommendation
375+
376+
filter := model.LoadControlLimitDescriptionDataType{
377+
LimitType: util.Ptr(limitType),
378+
LimitCategory: util.Ptr(category),
379+
ScopeType: util.Ptr(scope),
380+
}
381+
data, err = LoadControlLimits(nil, nil, filter)
382+
assert.NotNil(s.T(), err)
383+
assert.Nil(s.T(), data)
384+
385+
data, err = LoadControlLimits(s.localEntity, s.mockRemoteEntity, filter)
386+
assert.NotNil(s.T(), err)
387+
assert.Nil(s.T(), data)
388+
389+
data, err = LoadControlLimits(s.localEntity, s.monitoredEntity, filter)
390+
assert.NotNil(s.T(), err)
391+
assert.Nil(s.T(), data)
392+
393+
descData := &model.LoadControlLimitDescriptionListDataType{
394+
LoadControlLimitDescriptionData: []model.LoadControlLimitDescriptionDataType{
395+
{
396+
LimitId: util.Ptr(model.LoadControlLimitIdType(0)),
397+
LimitType: util.Ptr(limitType),
398+
LimitCategory: util.Ptr(category),
399+
MeasurementId: util.Ptr(model.MeasurementIdType(0)),
400+
Unit: util.Ptr(model.UnitOfMeasurementTypeA),
401+
ScopeType: util.Ptr(scope),
402+
},
403+
{
404+
LimitId: util.Ptr(model.LoadControlLimitIdType(1)),
405+
LimitType: util.Ptr(limitType),
406+
LimitCategory: util.Ptr(category),
407+
MeasurementId: util.Ptr(model.MeasurementIdType(1)),
408+
Unit: util.Ptr(model.UnitOfMeasurementTypeA),
409+
ScopeType: util.Ptr(scope),
410+
},
411+
{
412+
LimitId: util.Ptr(model.LoadControlLimitIdType(2)),
413+
LimitType: util.Ptr(limitType),
414+
LimitCategory: util.Ptr(category),
415+
MeasurementId: util.Ptr(model.MeasurementIdType(2)),
416+
Unit: util.Ptr(model.UnitOfMeasurementTypeA),
417+
ScopeType: util.Ptr(scope),
418+
},
419+
{
420+
LimitId: util.Ptr(model.LoadControlLimitIdType(3)),
421+
LimitType: util.Ptr(limitType),
422+
LimitCategory: util.Ptr(categoryRec),
423+
MeasurementId: util.Ptr(model.MeasurementIdType(0)),
424+
Unit: util.Ptr(model.UnitOfMeasurementTypeA),
425+
ScopeType: util.Ptr(scopeSelf),
426+
},
427+
{
428+
LimitId: util.Ptr(model.LoadControlLimitIdType(4)),
429+
LimitType: util.Ptr(limitType),
430+
LimitCategory: util.Ptr(categoryRec),
431+
MeasurementId: util.Ptr(model.MeasurementIdType(1)),
432+
Unit: util.Ptr(model.UnitOfMeasurementTypeA),
433+
ScopeType: util.Ptr(scopeSelf),
434+
},
435+
{
436+
LimitId: util.Ptr(model.LoadControlLimitIdType(5)),
437+
LimitType: util.Ptr(limitType),
438+
LimitCategory: util.Ptr(categoryRec),
439+
MeasurementId: util.Ptr(model.MeasurementIdType(2)),
440+
Unit: util.Ptr(model.UnitOfMeasurementTypeA),
441+
ScopeType: util.Ptr(scopeSelf),
442+
},
443+
},
444+
}
445+
446+
rFeature := s.remoteDevice.FeatureByEntityTypeAndRole(s.monitoredEntity, model.FeatureTypeTypeLoadControl, model.RoleTypeServer)
447+
fErr := rFeature.UpdateData(model.FunctionTypeLoadControlLimitDescriptionListData, descData, nil, nil)
448+
assert.Nil(s.T(), fErr)
449+
450+
data, err = LoadControlLimits(s.localEntity, s.monitoredEntity, filter)
451+
assert.Nil(s.T(), err)
452+
assert.Equal(s.T(), 3, len(data))
453+
assert.Equal(s.T(), 0.0, data[0].Value)
454+
455+
paramData := &model.ElectricalConnectionParameterDescriptionListDataType{
456+
ElectricalConnectionParameterDescriptionData: []model.ElectricalConnectionParameterDescriptionDataType{
457+
{
458+
ElectricalConnectionId: util.Ptr(model.ElectricalConnectionIdType(0)),
459+
ParameterId: util.Ptr(model.ElectricalConnectionParameterIdType(0)),
460+
AcMeasuredPhases: util.Ptr(model.ElectricalConnectionPhaseNameTypeAbc),
461+
ScopeType: util.Ptr(model.ScopeTypeTypeACPowerTotal),
462+
},
463+
{
464+
ElectricalConnectionId: util.Ptr(model.ElectricalConnectionIdType(0)),
465+
ParameterId: util.Ptr(model.ElectricalConnectionParameterIdType(1)),
466+
MeasurementId: util.Ptr(model.MeasurementIdType(0)),
467+
AcMeasuredPhases: util.Ptr(model.ElectricalConnectionPhaseNameTypeA),
468+
AcMeasurementVariant: util.Ptr(model.ElectricalConnectionMeasurandVariantTypeRms),
469+
},
470+
{
471+
ElectricalConnectionId: util.Ptr(model.ElectricalConnectionIdType(0)),
472+
ParameterId: util.Ptr(model.ElectricalConnectionParameterIdType(2)),
473+
MeasurementId: util.Ptr(model.MeasurementIdType(1)),
474+
AcMeasuredPhases: util.Ptr(model.ElectricalConnectionPhaseNameTypeB),
475+
AcMeasurementVariant: util.Ptr(model.ElectricalConnectionMeasurandVariantTypeRms),
476+
},
477+
{
478+
ElectricalConnectionId: util.Ptr(model.ElectricalConnectionIdType(0)),
479+
ParameterId: util.Ptr(model.ElectricalConnectionParameterIdType(3)),
480+
MeasurementId: util.Ptr(model.MeasurementIdType(2)),
481+
AcMeasuredPhases: util.Ptr(model.ElectricalConnectionPhaseNameTypeC),
482+
AcMeasurementVariant: util.Ptr(model.ElectricalConnectionMeasurandVariantTypeRms),
483+
},
484+
{
485+
ElectricalConnectionId: util.Ptr(model.ElectricalConnectionIdType(0)),
486+
ParameterId: util.Ptr(model.ElectricalConnectionParameterIdType(4)),
487+
MeasurementId: util.Ptr(model.MeasurementIdType(3)),
488+
AcMeasuredPhases: util.Ptr(model.ElectricalConnectionPhaseNameTypeA),
489+
},
490+
{
491+
ElectricalConnectionId: util.Ptr(model.ElectricalConnectionIdType(0)),
492+
ParameterId: util.Ptr(model.ElectricalConnectionParameterIdType(5)),
493+
MeasurementId: util.Ptr(model.MeasurementIdType(4)),
494+
AcMeasuredPhases: util.Ptr(model.ElectricalConnectionPhaseNameTypeB),
495+
},
496+
{
497+
ElectricalConnectionId: util.Ptr(model.ElectricalConnectionIdType(0)),
498+
ParameterId: util.Ptr(model.ElectricalConnectionParameterIdType(6)),
499+
MeasurementId: util.Ptr(model.MeasurementIdType(5)),
500+
AcMeasuredPhases: util.Ptr(model.ElectricalConnectionPhaseNameTypeC),
501+
},
502+
{
503+
ElectricalConnectionId: util.Ptr(model.ElectricalConnectionIdType(0)),
504+
ParameterId: util.Ptr(model.ElectricalConnectionParameterIdType(7)),
505+
MeasurementId: util.Ptr(model.MeasurementIdType(6)),
506+
VoltageType: util.Ptr(model.ElectricalConnectionVoltageTypeTypeAc),
507+
AcMeasuredPhases: util.Ptr(model.ElectricalConnectionPhaseNameTypeAbc),
508+
AcMeasurementType: util.Ptr(model.ElectricalConnectionAcMeasurementTypeTypeReal),
509+
},
510+
},
511+
}
512+
513+
rElFeature := s.remoteDevice.FeatureByEntityTypeAndRole(s.monitoredEntity, model.FeatureTypeTypeElectricalConnection, model.RoleTypeServer)
514+
fErr = rElFeature.UpdateData(model.FunctionTypeElectricalConnectionParameterDescriptionListData, paramData, nil, nil)
515+
assert.Nil(s.T(), fErr)
516+
517+
data, err = LoadControlLimits(s.localEntity, s.monitoredEntity, filter)
518+
assert.NotNil(s.T(), err)
519+
assert.Nil(s.T(), data)
520+
521+
limitData := &model.LoadControlLimitListDataType{
522+
LoadControlLimitData: []model.LoadControlLimitDataType{
523+
{
524+
LimitId: util.Ptr(model.LoadControlLimitIdType(0)),
525+
},
526+
{
527+
LimitId: util.Ptr(model.LoadControlLimitIdType(1)),
528+
},
529+
{
530+
LimitId: util.Ptr(model.LoadControlLimitIdType(2)),
531+
},
532+
{
533+
LimitId: util.Ptr(model.LoadControlLimitIdType(3)),
534+
},
535+
{
536+
LimitId: util.Ptr(model.LoadControlLimitIdType(4)),
537+
},
538+
{
539+
LimitId: util.Ptr(model.LoadControlLimitIdType(5)),
540+
},
541+
},
542+
}
543+
544+
fErr = rFeature.UpdateData(model.FunctionTypeLoadControlLimitListData, limitData, nil, nil)
545+
assert.Nil(s.T(), fErr)
546+
547+
data, err = LoadControlLimits(s.localEntity, s.monitoredEntity, filter)
548+
assert.Nil(s.T(), err)
549+
assert.Nil(s.T(), data)
550+
assert.Equal(s.T(), 0, len(data))
551+
552+
// according to OpEV Spec 1.0.1b, page 30: "At least one set of permitted values SHALL be stated."
553+
// which is not the case here for all elements
554+
permData := &model.ElectricalConnectionPermittedValueSetListDataType{
555+
ElectricalConnectionPermittedValueSetData: []model.ElectricalConnectionPermittedValueSetDataType{
556+
{
557+
ElectricalConnectionId: util.Ptr(model.ElectricalConnectionIdType(0)),
558+
ParameterId: util.Ptr(model.ElectricalConnectionParameterIdType(0)),
559+
PermittedValueSet: []model.ScaledNumberSetType{},
560+
},
561+
{
562+
ElectricalConnectionId: util.Ptr(model.ElectricalConnectionIdType(0)),
563+
ParameterId: util.Ptr(model.ElectricalConnectionParameterIdType(1)),
564+
},
565+
{
566+
ElectricalConnectionId: util.Ptr(model.ElectricalConnectionIdType(0)),
567+
ParameterId: util.Ptr(model.ElectricalConnectionParameterIdType(2)),
568+
},
569+
{
570+
ElectricalConnectionId: util.Ptr(model.ElectricalConnectionIdType(0)),
571+
ParameterId: util.Ptr(model.ElectricalConnectionParameterIdType(3)),
572+
},
573+
},
574+
}
575+
576+
fErr = rElFeature.UpdateData(model.FunctionTypeElectricalConnectionPermittedValueSetListData, permData, nil, nil)
577+
assert.Nil(s.T(), fErr)
578+
579+
data, err = LoadControlLimits(s.localEntity, s.monitoredEntity, filter)
580+
assert.Nil(s.T(), err)
581+
assert.Equal(s.T(), 0, len(data))
582+
}
583+
367584
func (s *InternalSuite) Test_WriteLoadControlLimit() {
368585
loadLimit := ucapi.LoadLimit{
369586
Duration: time.Minute * 2,

0 commit comments

Comments
 (0)