Vestel: decorate RFID support (#21124)

This commit is contained in:
mfuchs1984 2025-05-08 16:23:25 +02:00 • committed by GitHub
parent 856cc6145d
commit d0d6ac9810
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 69 additions and 10 deletions

View file

@ -67,7 +67,7 @@ func init() {
registry.AddCtx("vestel", NewVestelFromConfig)
}
//go:generate go tool decorate -f decorateVestel -b *Vestel -r api.Charger -t "api.PhaseSwitcher,Phases1p3p,func(int) error" -t "api.PhaseGetter,GetPhases,func() (int, error)"
//go:generate go tool decorate -f decorateVestel -b *Vestel -r api.Charger -t "api.PhaseSwitcher,Phases1p3p,func(int) error" -t "api.PhaseGetter,GetPhases,func() (int, error)" -t "api.Identifier,Identify,func() (string, error)"
// NewVestelFromConfig creates a Vestel charger from generic config
func NewVestelFromConfig(ctx context.Context, other map[string]interface{}) (api.Charger, error) {
@ -111,6 +111,11 @@ func NewVestel(ctx context.Context, uri string, id uint8) (api.Charger, error) {
phasesG = wb.getPhases
}
var identify func() (string, error)
if _, err := wb.identify(); err == nil {
identify = wb.identify
}
// get failsafe timeout from charger
b, err := wb.conn.ReadHoldingRegisters(vestelRegFailsafeTimeout, 1)
if err != nil {
@ -125,7 +130,7 @@ func NewVestel(ctx context.Context, uri string, id uint8) (api.Charger, error) {
}
go wb.heartbeat(ctx, timeout)
return decorateVestel(wb, phasesS, phasesG), err
return decorateVestel(wb, phasesS, phasesG, identify), err
}
func (wb *Vestel) heartbeat(ctx context.Context, timeout time.Duration) {
@ -298,10 +303,8 @@ func (wb *Vestel) getPhases() (int, error) {
return 1 + int(binary.BigEndian.Uint16(b))<<1, nil
}
var _ api.Identifier = (*Vestel)(nil)
// Identify implements the api.Identifier interface
func (wb *Vestel) Identify() (string, error) {
func (wb *Vestel) identify() (string, error) {
b, err := wb.conn.ReadInputRegisters(vestelRegRFID, 15)
if err != nil {
return "", err

View file

@ -6,12 +6,12 @@ import (
"github.com/evcc-io/evcc/api"
)
func decorateVestel(base *Vestel, phaseSwitcher func(int) error, phaseGetter func() (int, error)) api.Charger {
func decorateVestel(base *Vestel, phaseSwitcher func(int) error, phaseGetter func() (int, error), identifier func() (string, error)) api.Charger {
switch {
case phaseSwitcher == nil:
case identifier == nil && phaseSwitcher == nil:
return base
case phaseGetter == nil && phaseSwitcher != nil:
case identifier == nil && phaseGetter == nil && phaseSwitcher != nil:
return &struct {
*Vestel
api.PhaseSwitcher
@ -22,7 +22,7 @@ func decorateVestel(base *Vestel, phaseSwitcher func(int) error, phaseGetter fun
},
}
case phaseGetter != nil && phaseSwitcher != nil:
case identifier == nil && phaseGetter != nil && phaseSwitcher != nil:
return &struct {
*Vestel
api.PhaseGetter
@ -36,11 +36,64 @@ func decorateVestel(base *Vestel, phaseSwitcher func(int) error, phaseGetter fun
phaseSwitcher: phaseSwitcher,
},
}
case identifier != nil && phaseSwitcher == nil:
return &struct {
*Vestel
api.Identifier
}{
Vestel: base,
Identifier: &decorateVestelIdentifierImpl{
identifier: identifier,
},
}
case identifier != nil && phaseGetter == nil && phaseSwitcher != nil:
return &struct {
*Vestel
api.Identifier
api.PhaseSwitcher
}{
Vestel: base,
Identifier: &decorateVestelIdentifierImpl{
identifier: identifier,
},
PhaseSwitcher: &decorateVestelPhaseSwitcherImpl{
phaseSwitcher: phaseSwitcher,
},
}
case identifier != nil && phaseGetter != nil && phaseSwitcher != nil:
return &struct {
*Vestel
api.Identifier
api.PhaseGetter
api.PhaseSwitcher
}{
Vestel: base,
Identifier: &decorateVestelIdentifierImpl{
identifier: identifier,
},
PhaseGetter: &decorateVestelPhaseGetterImpl{
phaseGetter: phaseGetter,
},
PhaseSwitcher: &decorateVestelPhaseSwitcherImpl{
phaseSwitcher: phaseSwitcher,
},
}
}
return nil
}
type decorateVestelIdentifierImpl struct {
identifier func() (string, error)
}
func (impl *decorateVestelIdentifierImpl) Identify() (string, error) {
return impl.identifier()
}
type decorateVestelPhaseGetterImpl struct {
phaseGetter func() (int, error)
}

View file

@ -13,8 +13,11 @@ products:
- brand: E.ON Drive
description:
generic: vBox
capabilities: ["1p3p"]
capabilities: ["rfid", "1p3p"]
requirements:
description:
de: 1P3P und RFID erfordern Firmware 3.187.0 oder neuer.
en: 1P3P and RFID require at least firmware version 3.187.0.
evcc: ["sponsorship"]
params:
- name: modbus