Skip to content
This repository was archived by the owner on Jun 29, 2024. It is now read-only.

Commit b78714f

Browse files
committed
Add Data Update events to UCOPEV and UCOSCEV
1 parent a9049a1 commit b78714f

8 files changed

+229
-1
lines changed

ucopev/events.go

+23
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ func (e *UCOPEV) HandleEvent(payload spineapi.EventPayload) {
2626
}
2727

2828
switch payload.Data.(type) {
29+
case *model.ElectricalConnectionPermittedValueSetListDataType:
30+
e.evElectricalPermittedValuesUpdate(payload)
2931
case *model.LoadControlLimitDescriptionListDataType:
3032
e.evLoadControlLimitDescriptionDataUpdate(payload.Entity)
3133
case *model.LoadControlLimitListDataType:
@@ -90,3 +92,24 @@ func (e *UCOPEV) evLoadControlLimitDataUpdate(payload spineapi.EventPayload) {
9092
}
9193

9294
}
95+
96+
// the electrical connection permitted value sets data of an EV was updated
97+
func (e *UCOPEV) evElectricalPermittedValuesUpdate(payload spineapi.EventPayload) {
98+
evElectricalConnection, err := util.ElectricalConnection(e.service, payload.Entity)
99+
if err != nil {
100+
return
101+
}
102+
103+
data, err := evElectricalConnection.GetParameterDescriptionForMeasuredPhase(model.ElectricalConnectionPhaseNameTypeA)
104+
if err != nil || data.ParameterId == nil {
105+
return
106+
}
107+
108+
values, err := evElectricalConnection.GetPermittedValueSetForParameterId(*data.ParameterId)
109+
if err != nil || values == nil {
110+
return
111+
}
112+
113+
// Scenario 6
114+
e.eventCB(payload.Ski, payload.Device, payload.Entity, DataUpdateCurrentLimits)
115+
}

ucopev/events_test.go

+79
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ func (s *UCOPEVSuite) Test_Events() {
2626

2727
payload.EventType = spineapi.EventTypeDataChange
2828
payload.ChangeType = spineapi.ElementChangeUpdate
29+
payload.Data = eebusutil.Ptr(model.ElectricalConnectionPermittedValueSetListDataType{})
30+
s.sut.HandleEvent(payload)
31+
2932
payload.Data = eebusutil.Ptr(model.LoadControlLimitDescriptionListDataType{})
3033
s.sut.HandleEvent(payload)
3134

@@ -39,6 +42,82 @@ func (s *UCOPEVSuite) Test_Failures() {
3942
s.sut.evLoadControlLimitDescriptionDataUpdate(s.mockRemoteEntity)
4043
}
4144

45+
func (s *UCOPEVSuite) Test_evElectricalPermittedValuesUpdate() {
46+
payload := spineapi.EventPayload{
47+
Ski: remoteSki,
48+
Device: s.remoteDevice,
49+
Entity: s.mockRemoteEntity,
50+
}
51+
s.sut.evElectricalPermittedValuesUpdate(payload)
52+
53+
payload.Entity = s.evEntity
54+
s.sut.evElectricalPermittedValuesUpdate(payload)
55+
56+
paramData := &model.ElectricalConnectionParameterDescriptionListDataType{
57+
ElectricalConnectionParameterDescriptionData: []model.ElectricalConnectionParameterDescriptionDataType{
58+
{
59+
ElectricalConnectionId: eebusutil.Ptr(model.ElectricalConnectionIdType(0)),
60+
ParameterId: eebusutil.Ptr(model.ElectricalConnectionParameterIdType(0)),
61+
MeasurementId: eebusutil.Ptr(model.MeasurementIdType(0)),
62+
AcMeasuredPhases: eebusutil.Ptr(model.ElectricalConnectionPhaseNameTypeA),
63+
},
64+
{
65+
ElectricalConnectionId: eebusutil.Ptr(model.ElectricalConnectionIdType(0)),
66+
ParameterId: eebusutil.Ptr(model.ElectricalConnectionParameterIdType(1)),
67+
MeasurementId: eebusutil.Ptr(model.MeasurementIdType(1)),
68+
AcMeasuredPhases: eebusutil.Ptr(model.ElectricalConnectionPhaseNameTypeB),
69+
},
70+
{
71+
ElectricalConnectionId: eebusutil.Ptr(model.ElectricalConnectionIdType(0)),
72+
ParameterId: eebusutil.Ptr(model.ElectricalConnectionParameterIdType(2)),
73+
MeasurementId: eebusutil.Ptr(model.MeasurementIdType(2)),
74+
AcMeasuredPhases: eebusutil.Ptr(model.ElectricalConnectionPhaseNameTypeC),
75+
},
76+
},
77+
}
78+
79+
rFeature := s.remoteDevice.FeatureByEntityTypeAndRole(s.evEntity, model.FeatureTypeTypeElectricalConnection, model.RoleTypeServer)
80+
fErr := rFeature.UpdateData(model.FunctionTypeElectricalConnectionParameterDescriptionListData, paramData, nil, nil)
81+
assert.Nil(s.T(), fErr)
82+
83+
s.sut.evElectricalPermittedValuesUpdate(payload)
84+
85+
data := &model.ElectricalConnectionPermittedValueSetListDataType{
86+
ElectricalConnectionPermittedValueSetData: []model.ElectricalConnectionPermittedValueSetDataType{
87+
{
88+
ElectricalConnectionId: eebusutil.Ptr(model.ElectricalConnectionIdType(0)),
89+
ParameterId: eebusutil.Ptr(model.ElectricalConnectionParameterIdType(0)),
90+
PermittedValueSet: []model.ScaledNumberSetType{
91+
{
92+
Value: []model.ScaledNumberType{
93+
*model.NewScaledNumberType(0.1),
94+
},
95+
Range: []model.ScaledNumberRangeType{
96+
{
97+
Min: model.NewScaledNumberType(1400),
98+
Max: model.NewScaledNumberType(11000),
99+
},
100+
},
101+
},
102+
},
103+
},
104+
{
105+
ElectricalConnectionId: eebusutil.Ptr(model.ElectricalConnectionIdType(0)),
106+
ParameterId: eebusutil.Ptr(model.ElectricalConnectionParameterIdType(1)),
107+
},
108+
{
109+
ElectricalConnectionId: eebusutil.Ptr(model.ElectricalConnectionIdType(0)),
110+
ParameterId: eebusutil.Ptr(model.ElectricalConnectionParameterIdType(2)),
111+
},
112+
},
113+
}
114+
115+
fErr = rFeature.UpdateData(model.FunctionTypeElectricalConnectionPermittedValueSetListData, data, nil, nil)
116+
assert.Nil(s.T(), fErr)
117+
118+
s.sut.evElectricalPermittedValuesUpdate(payload)
119+
}
120+
42121
func (s *UCOPEVSuite) Test_evLoadControlLimitDataUpdate() {
43122
payload := spineapi.EventPayload{
44123
Ski: remoteSki,

ucopev/testhelper_test.go

+6
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,12 @@ func setupDevices(
9494
featureType model.FeatureTypeType
9595
supportedFcts []model.FunctionType
9696
}{
97+
{model.FeatureTypeTypeElectricalConnection,
98+
[]model.FunctionType{
99+
model.FunctionTypeElectricalConnectionParameterDescriptionListData,
100+
model.FunctionTypeElectricalConnectionPermittedValueSetListData,
101+
},
102+
},
97103
{model.FeatureTypeTypeLoadControl,
98104
[]model.FunctionType{
99105
model.FunctionTypeLoadControlLimitDescriptionListData,

ucopev/types.go

+7
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,13 @@ package ucopev
33
import "github.com/enbility/cemd/api"
44

55
const (
6+
// EV current limits
7+
//
8+
// The callback with this message provides:
9+
// - the device of the EVSE the EV is connected to
10+
// - the entity of the EV
11+
DataUpdateCurrentLimits api.EventType = "DataUpdateCurrentLimits"
12+
613
// EV load control obligation limit data updated
714
//
815
// The callback with this message provides:

ucoscev/events.go

+23
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ func (e *UCOSCEV) HandleEvent(payload spineapi.EventPayload) {
2323
// the codefactor warning is invalid, as .(type) check can not be replaced with if then
2424
//revive:disable-next-line
2525
switch payload.Data.(type) {
26+
case *model.ElectricalConnectionPermittedValueSetListDataType:
27+
e.evElectricalPermittedValuesUpdate(payload)
2628
case *model.LoadControlLimitListDataType:
2729
e.evLoadControlLimitDataUpdate(payload)
2830
}
@@ -54,3 +56,24 @@ func (e *UCOSCEV) evLoadControlLimitDataUpdate(payload spineapi.EventPayload) {
5456
return
5557
}
5658
}
59+
60+
// the electrical connection permitted value sets data of an EV was updated
61+
func (e *UCOSCEV) evElectricalPermittedValuesUpdate(payload spineapi.EventPayload) {
62+
evElectricalConnection, err := util.ElectricalConnection(e.service, payload.Entity)
63+
if err != nil {
64+
return
65+
}
66+
67+
data, err := evElectricalConnection.GetParameterDescriptionForMeasuredPhase(model.ElectricalConnectionPhaseNameTypeA)
68+
if err != nil || data.ParameterId == nil {
69+
return
70+
}
71+
72+
values, err := evElectricalConnection.GetPermittedValueSetForParameterId(*data.ParameterId)
73+
if err != nil || values == nil {
74+
return
75+
}
76+
77+
// Scenario 6
78+
e.eventCB(payload.Ski, payload.Device, payload.Entity, DataUpdateCurrentLimits)
79+
}

ucoscev/events_test.go

+77-1
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,89 @@ func (s *UCOSCEVSuite) Test_Events() {
2626

2727
payload.EventType = spineapi.EventTypeDataChange
2828
payload.ChangeType = spineapi.ElementChangeUpdate
29-
payload.Data = eebusutil.Ptr(model.LoadControlLimitDescriptionListDataType{})
29+
payload.Data = eebusutil.Ptr(model.ElectricalConnectionPermittedValueSetListDataType{})
3030
s.sut.HandleEvent(payload)
3131

3232
payload.Data = eebusutil.Ptr(model.LoadControlLimitListDataType{})
3333
s.sut.HandleEvent(payload)
3434
}
3535

36+
func (s *UCOSCEVSuite) Test_evElectricalPermittedValuesUpdate() {
37+
payload := spineapi.EventPayload{
38+
Ski: remoteSki,
39+
Device: s.remoteDevice,
40+
Entity: s.mockRemoteEntity,
41+
}
42+
s.sut.evElectricalPermittedValuesUpdate(payload)
43+
44+
payload.Entity = s.evEntity
45+
s.sut.evElectricalPermittedValuesUpdate(payload)
46+
47+
paramData := &model.ElectricalConnectionParameterDescriptionListDataType{
48+
ElectricalConnectionParameterDescriptionData: []model.ElectricalConnectionParameterDescriptionDataType{
49+
{
50+
ElectricalConnectionId: eebusutil.Ptr(model.ElectricalConnectionIdType(0)),
51+
ParameterId: eebusutil.Ptr(model.ElectricalConnectionParameterIdType(0)),
52+
MeasurementId: eebusutil.Ptr(model.MeasurementIdType(0)),
53+
AcMeasuredPhases: eebusutil.Ptr(model.ElectricalConnectionPhaseNameTypeA),
54+
},
55+
{
56+
ElectricalConnectionId: eebusutil.Ptr(model.ElectricalConnectionIdType(0)),
57+
ParameterId: eebusutil.Ptr(model.ElectricalConnectionParameterIdType(1)),
58+
MeasurementId: eebusutil.Ptr(model.MeasurementIdType(1)),
59+
AcMeasuredPhases: eebusutil.Ptr(model.ElectricalConnectionPhaseNameTypeB),
60+
},
61+
{
62+
ElectricalConnectionId: eebusutil.Ptr(model.ElectricalConnectionIdType(0)),
63+
ParameterId: eebusutil.Ptr(model.ElectricalConnectionParameterIdType(2)),
64+
MeasurementId: eebusutil.Ptr(model.MeasurementIdType(2)),
65+
AcMeasuredPhases: eebusutil.Ptr(model.ElectricalConnectionPhaseNameTypeC),
66+
},
67+
},
68+
}
69+
70+
rFeature := s.remoteDevice.FeatureByEntityTypeAndRole(s.evEntity, model.FeatureTypeTypeElectricalConnection, model.RoleTypeServer)
71+
fErr := rFeature.UpdateData(model.FunctionTypeElectricalConnectionParameterDescriptionListData, paramData, nil, nil)
72+
assert.Nil(s.T(), fErr)
73+
74+
s.sut.evElectricalPermittedValuesUpdate(payload)
75+
76+
data := &model.ElectricalConnectionPermittedValueSetListDataType{
77+
ElectricalConnectionPermittedValueSetData: []model.ElectricalConnectionPermittedValueSetDataType{
78+
{
79+
ElectricalConnectionId: eebusutil.Ptr(model.ElectricalConnectionIdType(0)),
80+
ParameterId: eebusutil.Ptr(model.ElectricalConnectionParameterIdType(0)),
81+
PermittedValueSet: []model.ScaledNumberSetType{
82+
{
83+
Value: []model.ScaledNumberType{
84+
*model.NewScaledNumberType(0.1),
85+
},
86+
Range: []model.ScaledNumberRangeType{
87+
{
88+
Min: model.NewScaledNumberType(1400),
89+
Max: model.NewScaledNumberType(11000),
90+
},
91+
},
92+
},
93+
},
94+
},
95+
{
96+
ElectricalConnectionId: eebusutil.Ptr(model.ElectricalConnectionIdType(0)),
97+
ParameterId: eebusutil.Ptr(model.ElectricalConnectionParameterIdType(1)),
98+
},
99+
{
100+
ElectricalConnectionId: eebusutil.Ptr(model.ElectricalConnectionIdType(0)),
101+
ParameterId: eebusutil.Ptr(model.ElectricalConnectionParameterIdType(2)),
102+
},
103+
},
104+
}
105+
106+
fErr = rFeature.UpdateData(model.FunctionTypeElectricalConnectionPermittedValueSetListData, data, nil, nil)
107+
assert.Nil(s.T(), fErr)
108+
109+
s.sut.evElectricalPermittedValuesUpdate(payload)
110+
}
111+
36112
func (s *UCOSCEVSuite) Test_evLoadControlLimitDataUpdate() {
37113
payload := spineapi.EventPayload{
38114
Ski: remoteSki,

ucoscev/testhelper_test.go

+7
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,13 @@ func setupDevices(
9696
role model.RoleType
9797
supportedFcts []model.FunctionType
9898
}{
99+
{model.FeatureTypeTypeElectricalConnection,
100+
model.RoleTypeServer,
101+
[]model.FunctionType{
102+
model.FunctionTypeElectricalConnectionParameterDescriptionListData,
103+
model.FunctionTypeElectricalConnectionPermittedValueSetListData,
104+
},
105+
},
99106
{model.FeatureTypeTypeLoadControl,
100107
model.RoleTypeServer,
101108
[]model.FunctionType{

ucoscev/types.go

+7
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,13 @@ package ucoscev
33
import "github.com/enbility/cemd/api"
44

55
const (
6+
// EV current limits
7+
//
8+
// The callback with this message provides:
9+
// - the device of the EVSE the EV is connected to
10+
// - the entity of the EV
11+
DataUpdateCurrentLimits api.EventType = "DataUpdateCurrentLimits"
12+
613
// EV load control recommendation limit data updated
714
//
815
// The callback with this message provides:

0 commit comments

Comments
 (0)