Skip to content

Commit 973a6e2

Browse files
committed
Add workaround for invalid MEB measurements
The PMCC EVSE can connect to MEB EVs via ISO and then uses the EV as NTP server. Sadly that server reports the wrong time and thus all measurements are invalid. This commit adds a workaround to test if the measurement is within 1 minute if the time is shifted by 1 or 2 hours.
1 parent ff5fe67 commit 973a6e2

File tree

2 files changed

+70
-2
lines changed

2 files changed

+70
-2
lines changed

usecases/cem/evcem/public.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ func (e *EVCEM) CurrentPerPhase(entity spineapi.EntityRemoteInterface) ([]float6
6565

6666
var result []float64
6767
refetch := true
68-
compare := time.Now().Add(-1 * time.Minute)
68+
compare := time.Now().UTC().Add(-1 * time.Minute)
6969

7070
for _, phase := range ucapi.PhaseNameMapping {
7171
for _, item := range data {
@@ -85,7 +85,18 @@ func (e *EVCEM) CurrentPerPhase(entity spineapi.EntityRemoteInterface) ([]float6
8585
phaseValue := item.Value.GetValue()
8686
result = append(result, phaseValue)
8787

88-
if item.Timestamp != nil {
88+
if item.Timestamp == nil {
89+
continue
90+
}
91+
92+
if timestamp, err := item.Timestamp.GetTime(); err == nil {
93+
refetch = timestamp.Before(compare)
94+
}
95+
96+
// the MEB cars report the wrong NTP time by 1 or 2 hours (depending on DST)
97+
// and PMCC uses NTP from the EV, so check these cases as well
98+
for i := 0; i < 2 && refetch; i++ {
99+
compare = compare.Add(-1 * time.Hour)
89100
if timestamp, err := item.Timestamp.GetTime(); err == nil {
90101
refetch = timestamp.Before(compare)
91102
}

usecases/cem/evcem/public_test.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package evcem
22

33
import (
4+
"time"
5+
46
"github.com/enbility/spine-go/model"
57
"github.com/enbility/spine-go/util"
68
"github.com/stretchr/testify/assert"
@@ -111,6 +113,61 @@ func (s *CemEVCEMSuite) Test_EVCurrentPerPhase() {
111113
data, err = s.sut.CurrentPerPhase(s.evEntity)
112114
assert.Nil(s.T(), err)
113115
assert.Equal(s.T(), 10.0, data[0])
116+
117+
now := time.Now().Add(-50 * time.Second)
118+
119+
measData = &model.MeasurementListDataType{
120+
MeasurementData: []model.MeasurementDataType{
121+
{
122+
MeasurementId: util.Ptr(model.MeasurementIdType(0)),
123+
Value: model.NewScaledNumberType(10),
124+
Timestamp: model.NewAbsoluteOrRelativeTimeTypeFromTime(now),
125+
},
126+
},
127+
}
128+
129+
fErr = rFeature.UpdateData(model.FunctionTypeMeasurementListData, measData, nil, nil)
130+
assert.Nil(s.T(), fErr)
131+
132+
data, err = s.sut.CurrentPerPhase(s.evEntity)
133+
assert.Nil(s.T(), err)
134+
assert.Equal(s.T(), 10.0, data[0])
135+
136+
now = now.Add(-1 * time.Hour)
137+
measData = &model.MeasurementListDataType{
138+
MeasurementData: []model.MeasurementDataType{
139+
{
140+
MeasurementId: util.Ptr(model.MeasurementIdType(0)),
141+
Value: model.NewScaledNumberType(10),
142+
Timestamp: model.NewAbsoluteOrRelativeTimeTypeFromTime(now),
143+
},
144+
},
145+
}
146+
147+
fErr = rFeature.UpdateData(model.FunctionTypeMeasurementListData, measData, nil, nil)
148+
assert.Nil(s.T(), fErr)
149+
150+
data, err = s.sut.CurrentPerPhase(s.evEntity)
151+
assert.Nil(s.T(), err)
152+
assert.Equal(s.T(), 10.0, data[0])
153+
154+
now = now.Add(-1 * time.Hour)
155+
measData = &model.MeasurementListDataType{
156+
MeasurementData: []model.MeasurementDataType{
157+
{
158+
MeasurementId: util.Ptr(model.MeasurementIdType(0)),
159+
Value: model.NewScaledNumberType(10),
160+
Timestamp: model.NewAbsoluteOrRelativeTimeTypeFromTime(now),
161+
},
162+
},
163+
}
164+
165+
fErr = rFeature.UpdateData(model.FunctionTypeMeasurementListData, measData, nil, nil)
166+
assert.Nil(s.T(), fErr)
167+
168+
data, err = s.sut.CurrentPerPhase(s.evEntity)
169+
assert.Nil(s.T(), err)
170+
assert.Equal(s.T(), 10.0, data[0])
114171
}
115172

116173
func (s *CemEVCEMSuite) Test_EVPowerPerPhase_Power() {

0 commit comments

Comments
 (0)