diff --git a/charger/alfen.go b/charger/alfen.go index c20e611cf0..068f62699e 100644 --- a/charger/alfen.go +++ b/charger/alfen.go @@ -55,7 +55,7 @@ func init() { registry.Add("alfen", NewAlfenFromConfig) } -//go:generate go run ../cmd/tools/decorate.go -f decorateAlfen -b *Alfen -r api.Charger -t "api.PhaseSwitcher,Phases1p3p,func(int) error" +//go:generate go run ../cmd/tools/decorate.go -f decorateAlfen -b *Alfen -r api.Charger -t "api.PhaseSwitcher,Phases1p3p,func(int) error" -t "api.PhaseGetter,GetPhases,func() (int, error)" // NewAlfenFromConfig creates a Alfen charger from generic config func NewAlfenFromConfig(other map[string]interface{}) (api.Charger, error) { @@ -93,15 +93,19 @@ func NewAlfen(uri string, slaveID uint8) (api.Charger, error) { _, v2, v3, err := wb.Voltages() - var phases1p3p func(int) error + var ( + phasesS func(int) error + phasesG func() (int, error) + ) if v2 != 0 && v3 != 0 { wb.log.DEBUG.Println("detected 3p alfen") - phases1p3p = wb.phases1p3p + phasesS = wb.phases1p3p + phasesG = wb.getPhases } else { wb.log.DEBUG.Println("detected 1p alfen") } - return decorateAlfen(wb, phases1p3p), err + return decorateAlfen(wb, phasesS, phasesG), err } func (wb *Alfen) heartbeat() { @@ -250,3 +254,12 @@ func (wb *Alfen) phases1p3p(phases int) error { _, err := wb.conn.WriteSingleRegister(alfenRegPhases, uint16(phases)) return err } + +// getPhases implements the api.PhaseGetter interface +func (wb *Alfen) getPhases() (int, error) { + b, err := wb.conn.ReadHoldingRegisters(alfenRegPhases, 1) + if err != nil { + return 0, err + } + return int(binary.BigEndian.Uint16(b)), nil +} diff --git a/charger/alfen_decorators.go b/charger/alfen_decorators.go index e7067abf5a..6fedbfe71b 100644 --- a/charger/alfen_decorators.go +++ b/charger/alfen_decorators.go @@ -6,12 +6,12 @@ import ( "github.com/evcc-io/evcc/api" ) -func decorateAlfen(base *Alfen, phaseSwitcher func(int) error) api.Charger { +func decorateAlfen(base *Alfen, phaseSwitcher func(int) error, phaseGetter func() (int, error)) api.Charger { switch { - case phaseSwitcher == nil: + case phaseGetter == nil && phaseSwitcher == nil: return base - case phaseSwitcher != nil: + case phaseGetter == nil && phaseSwitcher != nil: return &struct { *Alfen api.PhaseSwitcher @@ -21,11 +21,45 @@ func decorateAlfen(base *Alfen, phaseSwitcher func(int) error) api.Charger { phaseSwitcher: phaseSwitcher, }, } + + case phaseGetter != nil && phaseSwitcher == nil: + return &struct { + *Alfen + api.PhaseGetter + }{ + Alfen: base, + PhaseGetter: &decorateAlfenPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + } + + case phaseGetter != nil && phaseSwitcher != nil: + return &struct { + *Alfen + api.PhaseGetter + api.PhaseSwitcher + }{ + Alfen: base, + PhaseGetter: &decorateAlfenPhaseGetterImpl{ + phaseGetter: phaseGetter, + }, + PhaseSwitcher: &decorateAlfenPhaseSwitcherImpl{ + phaseSwitcher: phaseSwitcher, + }, + } } return nil } +type decorateAlfenPhaseGetterImpl struct { + phaseGetter func() (int, error) +} + +func (impl *decorateAlfenPhaseGetterImpl) GetPhases() (int, error) { + return impl.phaseGetter() +} + type decorateAlfenPhaseSwitcherImpl struct { phaseSwitcher func(int) error } diff --git a/charger/easee.go b/charger/easee.go index dff217bfff..457888ad10 100644 --- a/charger/easee.go +++ b/charger/easee.go @@ -310,7 +310,7 @@ func (c *Easee) ProductUpdate(i json.RawMessage) { case easee.PHASE_MODE: c.phaseMode = value.(int) case easee.OUTPUT_PHASE: - c.outputPhase = value.(int) / 10 //API gives 0,10,30 for 0,1,3p + c.outputPhase = value.(int) / 10 // API gives 0,10,30 for 0,1,3p case easee.DYNAMIC_CHARGER_CURRENT: c.dynamicChargerCurrent = value.(float64) diff --git a/charger/solax.go b/charger/solax.go index aae4441478..2e3cfbd32a 100644 --- a/charger/solax.go +++ b/charger/solax.go @@ -122,8 +122,7 @@ func (wb *Solax) Status() (api.ChargeStatus, error) { 7, // "SuspendedEV" 3: // "Finishing" return api.StatusB, nil - case - 2: // "Charging" + case 2: // "Charging" return api.StatusC, nil case 6, // "Reserved" diff --git a/charger/sungrow.go b/charger/sungrow.go index 4a4b02ff5f..6e959493c7 100644 --- a/charger/sungrow.go +++ b/charger/sungrow.go @@ -118,8 +118,7 @@ func (wb *Sungrow) Status() (api.ChargeStatus, error) { } switch s := binary.BigEndian.Uint16(b); s { - case - 1: // "Idle" + case 1: // "Idle" return api.StatusA, nil case 2, // "Standby" @@ -127,8 +126,7 @@ func (wb *Sungrow) Status() (api.ChargeStatus, error) { 5, // "SuspendedEV" 6: // "Completed" return api.StatusB, nil - case - 3: // "Charging" + case 3: // "Charging" return api.StatusC, nil case 7, // "Reserved"