diff --git a/charger/ocpp/connector_core.go b/charger/ocpp/connector_core.go index 0f0e0f9e0..3933dce05 100644 --- a/charger/ocpp/connector_core.go +++ b/charger/ocpp/connector_core.go @@ -60,7 +60,7 @@ func (conn *Connector) MeterValues(request *core.MeterValuesRequest) (*core.Mete conn.txnId = *request.TransactionId } - for _, meterValue := range request.MeterValue { + for _, meterValue := range sortByAge(request.MeterValue) { // ignore old meter value requests if meterValue.Timestamp.Time.After(conn.meterUpdated) { for _, sample := range meterValue.SampledValue { diff --git a/charger/ocpp/helper.go b/charger/ocpp/helper.go index d774c741e..12dce8d5e 100644 --- a/charger/ocpp/helper.go +++ b/charger/ocpp/helper.go @@ -1,9 +1,11 @@ package ocpp import ( + "slices" "time" "github.com/evcc-io/evcc/api" + "github.com/lorenzodonini/ocpp-go/ocpp1.6/types" ) // Wait waits for a CP roundtrip with timeout @@ -18,3 +20,16 @@ func Wait(err error, rc chan error, timeout time.Duration) error { } return err } + +func sortByAge(values []types.MeterValue) []types.MeterValue { + return slices.SortedFunc(slices.Values(values), func(a, b types.MeterValue) int { + var at, bt time.Time + if a.Timestamp != nil { + at = a.Timestamp.Time + } + if b.Timestamp != nil { + bt = b.Timestamp.Time + } + return at.Compare(bt) + }) +} diff --git a/charger/ocpp/helper_test.go b/charger/ocpp/helper_test.go new file mode 100644 index 000000000..6a7acf587 --- /dev/null +++ b/charger/ocpp/helper_test.go @@ -0,0 +1,23 @@ +package ocpp + +import ( + "testing" + "time" + + "github.com/lorenzodonini/ocpp-go/ocpp1.6/types" + "github.com/stretchr/testify/assert" +) + +func TestSortByAge(t *testing.T) { + assert.Equal(t, []types.MeterValue{ + {Timestamp: nil}, + {Timestamp: types.NewDateTime(time.UnixMilli(1))}, + {Timestamp: types.NewDateTime(time.UnixMilli(2))}, + {Timestamp: types.NewDateTime(time.UnixMilli(3))}, + }, sortByAge([]types.MeterValue{ + {Timestamp: types.NewDateTime(time.UnixMilli(3))}, + {Timestamp: types.NewDateTime(time.UnixMilli(1))}, + {Timestamp: nil}, + {Timestamp: types.NewDateTime(time.UnixMilli(2))}, + })) +}