From b28c7b516bf41662fec2c5e7632ecf99afaccf93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20He=C3=9F?= Date: Tue, 29 Aug 2023 18:03:29 +0200 Subject: [PATCH] Always treat charger as enabled when charging (#9570) --- core/loadpoint.go | 17 +++++++------- core/loadpoint_sync_test.go | 45 +++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 8 deletions(-) create mode 100644 core/loadpoint_sync_test.go diff --git a/core/loadpoint.go b/core/loadpoint.go index 9e7ec9064..9e0e438a2 100644 --- a/core/loadpoint.go +++ b/core/loadpoint.go @@ -640,6 +640,15 @@ func (lp *Loadpoint) syncCharger() error { lp.publish("enabled", lp.enabled) }() + if !enabled && lp.charging() { + if lp.guardGracePeriodElapsed() { + lp.log.WARN.Println("charger logic error: disabled but charging") + } + enabled = true // treat as enabled when charging + lp.elapseGuard() + return nil + } + // status in sync if enabled == lp.enabled { // sync max current @@ -671,14 +680,6 @@ func (lp *Loadpoint) syncCharger() error { return nil } - if !enabled && lp.charging() { - if lp.guardGracePeriodElapsed() { - lp.log.WARN.Println("charger logic error: disabled but charging") - } - lp.elapseGuard() - return nil - } - return nil } diff --git a/core/loadpoint_sync_test.go b/core/loadpoint_sync_test.go new file mode 100644 index 000000000..92ba193a8 --- /dev/null +++ b/core/loadpoint_sync_test.go @@ -0,0 +1,45 @@ +package core + +import ( + "testing" + + "github.com/benbjohnson/clock" + "github.com/evcc-io/evcc/api" + "github.com/evcc-io/evcc/mock" + "github.com/evcc-io/evcc/util" + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/assert" +) + +func TestSyncCharger(t *testing.T) { + tc := []struct { + status api.ChargeStatus + expected, actual, corrected bool + }{ + {api.StatusA, false, false, false}, + {api.StatusC, false, false, true}, // disabled but charging + {api.StatusA, false, true, true}, + {api.StatusA, true, false, false}, + {api.StatusA, true, true, true}, + } + + ctrl := gomock.NewController(t) + + for _, tc := range tc { + t.Logf("%+v", tc) + + charger := mock.NewMockCharger(ctrl) + charger.EXPECT().Enabled().Return(tc.actual, nil).AnyTimes() + + lp := &Loadpoint{ + log: util.NewLogger("foo"), + clock: clock.New(), + charger: charger, + status: tc.status, + enabled: tc.expected, + } + + assert.NoError(t, lp.syncCharger()) + assert.Equal(t, tc.corrected, lp.enabled) + } +}