diff --git a/api/api.go b/api/api.go index 49a42a744..ef219457b 100644 --- a/api/api.go +++ b/api/api.go @@ -113,6 +113,11 @@ type CurrentLimiter interface { MaxCurrent(current int64) error } +// CurrentGetter provides getting charging maximum charging current for validation +type CurrentGetter interface { + GetMaxCurrent() (float64, error) +} + // Charger provides current charging status and enable/disable charging type Charger interface { ChargeState diff --git a/core/loadpoint.go b/core/loadpoint.go index b9ee3080b..84688c294 100644 --- a/core/loadpoint.go +++ b/core/loadpoint.go @@ -652,6 +652,24 @@ func (lp *Loadpoint) syncCharger() error { return lp.charger.Enable(false) } + if charger, ok := lp.charger.(api.CurrentGetter); ok { + current, err := charger.GetMaxCurrent() + if err != nil { + return err + } + + if enabled && lp.chargeCurrent != current { + if lp.guardGracePeriodElapsed() { + lp.log.WARN.Printf("charger logic error: current mismatch (got %.3gA, expected %.3gA)", current, lp.chargeCurrent) + } + + if charger, ok := lp.charger.(api.ChargerEx); ok { + return charger.MaxCurrentMillis(lp.chargeCurrent) + } + return lp.charger.MaxCurrent(int64(lp.chargeCurrent)) + } + } + return nil }