From 90c0f96944233220cfd9a2fa2ed742213f514f94 Mon Sep 17 00:00:00 2001 From: andig Date: Sat, 13 Jan 2024 10:37:29 +0100 Subject: [PATCH] Loadpoint: make sure restoring settings publishes current values (#11637) --- core/loadpoint.go | 28 ++++++++++++++-------------- core/loadpoint_api.go | 11 ++++++++--- core/loadpoint_test.go | 5 ++++- 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/core/loadpoint.go b/core/loadpoint.go index cff269709..0eb63132f 100644 --- a/core/loadpoint.go +++ b/core/loadpoint.go @@ -260,9 +260,6 @@ func NewLoadpointFromConfig(log *util.Logger, settings *Settings, other map[stri lp.mode = api.ModeOff } - // restore settings - lp.restoreSettings() - return lp, nil } @@ -300,20 +297,20 @@ func NewLoadpoint(log *util.Logger, settings *Settings) *Loadpoint { // restoreSettings restores loadpoint settings func (lp *Loadpoint) restoreSettings() { - if v, err := lp.settings.String(keys.Mode); err == nil { - lp.mode = api.ChargeMode(v) + if v, err := lp.settings.String(keys.Mode); err == nil && v != "" { + lp.setMode(api.ChargeMode(v)) } - if v, err := lp.settings.Time(keys.PlanTime); err == nil { - lp.planTime = v + if v, err := lp.settings.Int(keys.LimitSoc); err == nil && v > 0 { + lp.setLimitSoc(int(v)) } - if v, err := lp.settings.Float(keys.PlanEnergy); err == nil { - lp.planEnergy = v + if v, err := lp.settings.Float(keys.LimitEnergy); err == nil && v > 0 { + lp.setLimitEnergy(v) } - if v, err := lp.settings.Int(keys.LimitSoc); err == nil { - lp.limitSoc = int(v) - } - if v, err := lp.settings.Float(keys.LimitEnergy); err == nil { - lp.limitEnergy = v + + t, err1 := lp.settings.Time(keys.PlanTime) + v, err2 := lp.settings.Float(keys.PlanEnergy) + if err1 == nil && err2 == nil { + lp.setPlanEnergy(t, v) } } @@ -570,6 +567,9 @@ func (lp *Loadpoint) Prepare(uiChan chan<- util.Param, pushChan chan<- push.Even _ = lp.bus.Subscribe(evChargeCurrent, lp.evChargeCurrentHandler) _ = lp.bus.Subscribe(evVehicleSoc, lp.evVehicleSocProgressHandler) + // restore settings + lp.restoreSettings() + // publish initial values lp.publish(keys.Title, lp.Title()) lp.publish(keys.Mode, lp.GetMode()) diff --git a/core/loadpoint_api.go b/core/loadpoint_api.go index 157d146ee..8b88ba745 100644 --- a/core/loadpoint_api.go +++ b/core/loadpoint_api.go @@ -34,6 +34,13 @@ func (lp *Loadpoint) GetMode() api.ChargeMode { return lp.mode } +// setMode sets loadpoint charge mode (no mutex) +func (lp *Loadpoint) setMode(mode api.ChargeMode) { + lp.mode = mode + lp.publish(keys.Mode, mode) + lp.settings.SetString(keys.Mode, string(mode)) +} + // SetMode sets loadpoint charge mode func (lp *Loadpoint) SetMode(mode api.ChargeMode) { lp.Lock() @@ -48,9 +55,7 @@ func (lp *Loadpoint) SetMode(mode api.ChargeMode) { // apply immediately if lp.mode != mode { - lp.mode = mode - lp.publish(keys.Mode, mode) - lp.settings.SetString(keys.Mode, string(mode)) + lp.setMode(mode) // reset timers switch mode { diff --git a/core/loadpoint_test.go b/core/loadpoint_test.go index d5c129834..09ad48934 100644 --- a/core/loadpoint_test.go +++ b/core/loadpoint_test.go @@ -431,6 +431,7 @@ func TestDisableAndEnableAtTargetSoc(t *testing.T) { charger.EXPECT().Enabled().Return(lp.enabled, nil) charger.EXPECT().MaxCurrent(int64(maxA)).Return(nil) lp.Update(500, false, false, false, 0, nil, nil) + ctrl.Finish() t.Log("charging above target - soc deactivates charger") clock.Add(5 * time.Minute) @@ -439,6 +440,7 @@ func TestDisableAndEnableAtTargetSoc(t *testing.T) { charger.EXPECT().Enabled().Return(lp.enabled, nil) charger.EXPECT().Enable(false).Return(nil) lp.Update(500, false, false, false, 0, nil, nil) + ctrl.Finish() t.Log("deactivated charger changes status to B") clock.Add(5 * time.Minute) @@ -446,12 +448,14 @@ func TestDisableAndEnableAtTargetSoc(t *testing.T) { charger.EXPECT().Status().Return(api.StatusB, nil) charger.EXPECT().Enabled().Return(lp.enabled, nil) lp.Update(-5000, false, false, false, 0, nil, nil) + ctrl.Finish() t.Log("soc has fallen below target - soc update prevented by timer") clock.Add(5 * time.Minute) charger.EXPECT().Status().Return(api.StatusB, nil) charger.EXPECT().Enabled().Return(lp.enabled, nil) lp.Update(-5000, false, false, false, 0, nil, nil) + ctrl.Finish() t.Log("soc has fallen below target - soc update timer expired") clock.Add(pollInterval) @@ -460,7 +464,6 @@ func TestDisableAndEnableAtTargetSoc(t *testing.T) { charger.EXPECT().Enabled().Return(lp.enabled, nil) charger.EXPECT().Enable(true).Return(nil) lp.Update(-5000, false, false, false, 0, nil, nil) - ctrl.Finish() }