From 308f2983353052022c928d8146a62caa7029ba1a Mon Sep 17 00:00:00 2001 From: lurtz <727209+lurtz@users.noreply.github.com> Date: Tue, 9 Sep 2025 16:43:31 +0200 Subject: [PATCH] Ocpp: zero phase powers when transaction stops (#23464) --- charger/ocpp/connector_core.go | 17 +++++++++++++++-- charger/ocpp/connector_test.go | 20 ++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/charger/ocpp/connector_core.go b/charger/ocpp/connector_core.go index 3dc1d468e..935916257 100644 --- a/charger/ocpp/connector_core.go +++ b/charger/ocpp/connector_core.go @@ -116,8 +116,21 @@ func (conn *Connector) assumeMeterStopped() { } for phase := 1; phase <= 3; phase++ { - if _, ok := conn.measurements[getPhaseKey(types.MeasurandCurrentImport, phase)]; ok { - conn.measurements[getPhaseKey(types.MeasurandCurrentImport, phase)] = types.SampledValue{ + // phase powers + for _, suffix := range []types.Measurand{"", "-N"} { + key := getPhaseKey(types.MeasurandPowerActiveImport, phase) + suffix + if _, ok := conn.measurements[key]; ok { + conn.measurements[key] = types.SampledValue{ + Value: "0", + Unit: types.UnitOfMeasureW, + } + } + } + + // phase currents + key := getPhaseKey(types.MeasurandCurrentImport, phase) + if _, ok := conn.measurements[key]; ok { + conn.measurements[key] = types.SampledValue{ Value: "0", Unit: types.UnitOfMeasureA, } diff --git a/charger/ocpp/connector_test.go b/charger/ocpp/connector_test.go index fb80a46bd..835f3ad17 100644 --- a/charger/ocpp/connector_test.go +++ b/charger/ocpp/connector_test.go @@ -152,3 +152,23 @@ func (suite *connTestSuite) TestConnectorMeasurementsRunningTxn() { _, _, _, err = suite.conn.Voltages() suite.NoError(err, "Voltages") } + +func (suite *connTestSuite) TestOnStopTransactionResetsReportedPower() { + suite.conn.meterUpdated = suite.clock.Now() + + // Set some power + suite.conn.measurements[types.MeasurandPowerActiveImport+".L1-N"] = types.SampledValue{Value: "1"} + suite.conn.measurements[types.MeasurandPowerActiveImport+".L2-N"] = types.SampledValue{Value: "1"} + suite.conn.measurements[types.MeasurandPowerActiveImport+".L3-N"] = types.SampledValue{Value: "1"} + + res, err := suite.conn.CurrentPower() + suite.NoError(err, "CurrentPower") + suite.Equal(res, 3.0, "CurrentPower") + + // set powers to zero + suite.conn.OnStopTransaction(nil) + + res, err = suite.conn.CurrentPower() + suite.NoError(err, "CurrentPower") + suite.Equal(res, 0.0, "CurrentPower") +}