Amperfied: add phase getter (#16639)

This commit is contained in:
andig 2024-10-13 19:06:46 +02:00 • committed by GitHub
parent 16c467a65d
commit ccade7c1f0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 40 additions and 4 deletions

View file

@ -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
}

View file

@ -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
}