From 8215106809b05425ff95fe13585554719df6a346 Mon Sep 17 00:00:00 2001 From: andig Date: Sun, 13 Oct 2024 18:41:34 +0200 Subject: [PATCH] Amperfied: add phase getter --- charger/amperfied.go | 17 +++++++++++++++-- charger/amperfied_decorators.go | 27 +++++++++++++++++++++++++-- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/charger/amperfied.go b/charger/amperfied.go index 9cae183619..6dd367c398 100644 --- a/charger/amperfied.go +++ b/charger/amperfied.go @@ -49,6 +49,7 @@ const ( ampRegAmpsConfig = 261 // Holding ampRegFailSafeConfig = 262 // Holding ampRegPhaseSwitchControl = 501 // Holding + ampRegPhaseSwitchState = 5001 // Input ampRegRfidUID = 2002 // Input ) @@ -56,7 +57,7 @@ func init() { registry.Add("amperfied", NewAmperfiedFromConfig) } -//go:generate go run ../cmd/tools/decorate.go -f decorateAmperfied -b *Amperfied -r api.Charger -t "api.PhaseSwitcher,Phases1p3p,func(int) error" +//go:generate go run ../cmd/tools/decorate.go -f decorateAmperfied -b *Amperfied -r api.Charger -t "api.PhaseSwitcher,Phases1p3p,func(int) error" -t "api.PhaseGetter,GetPhases,func() (int, error)" // NewAmperfiedFromConfig creates a Amperfied charger from generic config func NewAmperfiedFromConfig(other map[string]interface{}) (api.Charger, error) { @@ -106,11 +107,13 @@ func NewAmperfied(uri string, slaveID uint8, phases bool) (api.Charger, error) { } var phases1p3p func(int) error + var phasesG func() (int, error) if phases { phases1p3p = wb.phases1p3p + phasesG = wb.getPhases } - return decorateAmperfied(wb, phases1p3p), nil + return decorateAmperfied(wb, phases1p3p, phasesG), nil } func (wb *Amperfied) heartbeat(timeout time.Duration) { @@ -343,3 +346,13 @@ func (wb *Amperfied) phases1p3p(phases int) error { _, err := wb.conn.WriteMultipleRegisters(ampRegPhaseSwitchControl, 1, b) return err } + +// getPhases implements the api.PhaseGetter interface +func (wb *Amperfied) getPhases() (int, error) { + b, err := wb.conn.ReadInputRegisters(ampRegPhaseSwitchState, 1) + if err != nil { + return 0, err + } + + return int(binary.BigEndian.Uint16(b)), nil +} diff --git a/charger/amperfied_decorators.go b/charger/amperfied_decorators.go index 16fabb46dc..ca524d1e87 100644 --- a/charger/amperfied_decorators.go +++ b/charger/amperfied_decorators.go @@ -6,12 +6,12 @@ import ( "github.com/evcc-io/evcc/api" ) -func decorateAmperfied(base *Amperfied, phaseSwitcher func(int) error) api.Charger { +func decorateAmperfied(base *Amperfied, phaseSwitcher func(int) error, phaseGetter func() (int, error)) api.Charger { switch { case phaseSwitcher == nil: return base - case phaseSwitcher != nil: + case phaseGetter == nil && phaseSwitcher != nil: return &struct { *Amperfied api.PhaseSwitcher @@ -21,11 +21,34 @@ func decorateAmperfied(base *Amperfied, phaseSwitcher func(int) error) api.Charg phaseSwitcher: phaseSwitcher, }, } + + case phaseGetter != nil && phaseSwitcher != nil: + return &struct { + *Amperfied + api.PhaseGetter + api.PhaseSwitcher + }{ + Amperfied: base, + PhaseGetter: &decorateAmperfiedPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateAmperfiedPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } } return nil } +type decorateAmperfiedPhaseGetterImpl struct { + phaseGetter func() (int, error) +} + +func (impl *decorateAmperfiedPhaseGetterImpl) GetPhases() (int, error) { + return impl.phaseGetter() +} + type decorateAmperfiedPhaseSwitcherImpl struct { phaseSwitcher func(int) error }