From e08016f6e9bd38950fbf65f9e72d2bc719f913c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20He=C3=9F?= Date: Fri, 18 Apr 2025 10:45:43 +0200 Subject: [PATCH] Easee: remove custom logic based on erratic lifetime_energy (#20668) --- charger/easee.go | 27 +++------------------------ charger/easee_test.go | 34 ---------------------------------- 2 files changed, 3 insertions(+), 58 deletions(-) diff --git a/charger/easee.go b/charger/easee.go index caa7600fb..0947e17e5 100644 --- a/charger/easee.go +++ b/charger/easee.go @@ -60,7 +60,6 @@ type Easee struct { pilotMode string reasonForNoCurrent int phaseMode int - sessionStartEnergy *float64 currentPower, sessionEnergy, totalEnergy, currentL1, currentL2, currentL3 float64 rfid string @@ -294,11 +293,6 @@ func (c *Easee) ProductUpdate(i json.RawMessage) { c.sessionEnergy = value.(float64) case easee.LIFETIME_ENERGY: c.totalEnergy = value.(float64) - // Remember value of LIFETIME_ENERGY as start value of the charging session - if c.sessionStartEnergy == nil { - f := c.totalEnergy - c.sessionStartEnergy = &f - } case easee.IN_CURRENT_T3: c.currentL1 = value.(float64) case easee.IN_CURRENT_T4: @@ -317,17 +311,8 @@ func (c *Easee) ProductUpdate(i json.RawMessage) { c.maxChargerCurrent = value.(float64) case easee.DYNAMIC_CHARGER_CURRENT: c.dynamicChargerCurrent = value.(float64) - case easee.CHARGER_OP_MODE: - opMode := value.(int) - - // New charging session pending, reset sessionStartEnergy - if c.opMode <= easee.ModeDisconnected && opMode >= easee.ModeAwaitingStart { - c.sessionStartEnergy = nil - } - - c.opMode = opMode - + c.opMode = value.(int) case easee.REASON_FOR_NO_CURRENT: c.reasonForNoCurrent = value.(int) case easee.PILOT_MODE: @@ -678,14 +663,6 @@ var _ api.ChargeRater = (*Easee)(nil) func (c *Easee) ChargedEnergy() (float64, error) { c.mux.RLock() defer c.mux.RUnlock() - - // return either the self calced session energy (current LIFETIME_ENERGY minus remembered start value), - // or the SESSION_ENERGY value by the API. Each value could be lower than the other, depending on - // order and receive timestamp of the product update. We want to return the higher (and newer) value. - if c.sessionStartEnergy != nil { - return max(c.sessionEnergy, c.totalEnergy-*c.sessionStartEnergy), nil - } - return c.sessionEnergy, nil } @@ -704,6 +681,8 @@ var _ api.MeterEnergy = (*Easee)(nil) func (c *Easee) TotalEnergy() (float64, error) { c.mux.RLock() defer c.mux.RUnlock() + // updates for this are only sent once an hour, so inaccurate by design + // see also https://github.com/evcc-io/evcc/issues/20594 return c.totalEnergy, nil } diff --git a/charger/easee_test.go b/charger/easee_test.go index ab1210310..29dd4965a 100644 --- a/charger/easee_test.go +++ b/charger/easee_test.go @@ -49,37 +49,3 @@ func TestProductUpdate_IgnoreOutdatedProductUpdate(t *testing.T) { assert.Equal(t, now, e.obsTime[easee.CHARGER_OP_MODE]) assert.Equal(t, 2, e.opMode) } - -func TestProductUpdate_LifetimeEnergyAndSessionStartEnergy(t *testing.T) { - e := newEasee() - - now := time.Now().UTC().Truncate(0) - e.ProductUpdate(createPayload(easee.LIFETIME_ENERGY, now, easee.Double, "20")) - - assert.Equal(t, now, e.obsTime[easee.LIFETIME_ENERGY]) - assert.Equal(t, float64(20), e.totalEnergy) - assert.Equal(t, float64(20), *e.sessionStartEnergy) - - t2 := time.Now().UTC().Truncate(0) - e.ProductUpdate(createPayload(easee.LIFETIME_ENERGY, t2, easee.Double, "40")) - - assert.Equal(t, t2, e.obsTime[easee.LIFETIME_ENERGY]) - assert.Equal(t, float64(40), e.totalEnergy) - assert.Equal(t, float64(20), *e.sessionStartEnergy) -} - -func TestProductUpdate_ChargeStartSessionEnergy(t *testing.T) { - e := newEasee() - - t_minus_5 := time.Now().UTC().Truncate(0).Add(-5 * time.Second) - - e.ProductUpdate(createPayload(easee.CHARGER_OP_MODE, t_minus_5, easee.Integer, "2")) - - assert.Equal(t, t_minus_5, e.obsTime[easee.CHARGER_OP_MODE]) - assert.Equal(t, 2, e.opMode) - - assert.Nil(t, e.sessionStartEnergy) - - assert.Equal(t, float64(0), e.sessionEnergy) - assert.NotEqual(t, t_minus_5, e.obsTime[easee.SESSION_ENERGY]) -}