Bender: detect RFID availability (#4418)
Some checks failed
Release / call-build-workflow (push) Has been cancelled
Release / Publish Docker :release (push) Has been cancelled
Release / Publish Github & APT release (push) Has been cancelled
Release / Create Hassio Addon Release (push) Has been cancelled

This commit is contained in:
andig 2022-09-13 22:03:48 +02:00 • committed by GitHub
parent 6bbfeffb8f
commit fd0c4abebf
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 350 additions and 24 deletions

View file

@ -82,7 +82,7 @@ func NewBenderCCFromConfig(other map[string]interface{}) (api.Charger, error) {
return NewBenderCC(cc.URI, cc.ID)
}
//go:generate go run ../cmd/tools/decorate.go -f decorateBenderCC -b *BenderCC -r api.Charger -t "api.Meter,CurrentPower,func() (float64, error)" -t "api.MeterCurrent,Currents,func() (float64, float64, float64, error)" -t "api.ChargeRater,ChargedEnergy,func() (float64, error)" -t "api.MeterEnergy,TotalEnergy,func() (float64, error)"
//go:generate go run ../cmd/tools/decorate.go -f decorateBenderCC -b *BenderCC -r api.Charger -t "api.Meter,CurrentPower,func() (float64, error)" -t "api.MeterCurrent,Currents,func() (float64, float64, float64, error)" -t "api.ChargeRater,ChargedEnergy,func() (float64, error)" -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" -t "api.Identifier,Identify,func() (string, error)"
// NewBenderCC creates BenderCC charger
func NewBenderCC(uri string, id uint8) (api.Charger, error) {
@ -108,6 +108,14 @@ func NewBenderCC(uri string, id uint8) (api.Charger, error) {
wb.legacy = true
}
var (
currentPower func() (float64, error)
currents func() (float64, float64, float64, error)
chargedEnergy func() (float64, error)
totalEnergy func() (float64, error)
identify func() (string, error)
)
// check presence of metering
reg := uint16(bendRegActivePower)
if wb.legacy {
@ -115,10 +123,18 @@ func NewBenderCC(uri string, id uint8) (api.Charger, error) {
}
if b, err := wb.conn.ReadHoldingRegisters(reg, 2); err == nil && binary.BigEndian.Uint32(b) != math.MaxUint32 {
return decorateBenderCC(wb, wb.currentPower, wb.currents, wb.chargedEnergy, wb.totalEnergy), nil
currentPower = wb.currentPower
currents = wb.currents
chargedEnergy = wb.chargedEnergy
totalEnergy = wb.totalEnergy
}
return wb, err
// check rfid
if _, err := wb.identify(); err == nil {
identify = wb.identify
}
return decorateBenderCC(wb, currentPower, currents, chargedEnergy, totalEnergy, identify), nil
}
// Status implements the api.Charger interface
@ -277,10 +293,8 @@ func (wb *BenderCC) currents() (float64, float64, float64, error) {
return curr[0], curr[1], curr[2], nil
}
var _ api.Identifier = (*BenderCC)(nil)
// Identify implements the api.Identifier interface
func (wb *BenderCC) Identify() (string, error) {
// identify implements the api.Identifier interface
func (wb *BenderCC) identify() (string, error) {
if !wb.legacy {
var id []byte

View file

@ -6,12 +6,12 @@ import (
"github.com/evcc-io/evcc/api"
)
func decorateBenderCC(base *BenderCC, meter func() (float64, error), meterCurrent func() (float64, float64, float64, error), chargeRater func() (float64, error), meterEnergy func() (float64, error)) api.Charger {
func decorateBenderCC(base *BenderCC, meter func() (float64, error), meterCurrent func() (float64, float64, float64, error), chargeRater func() (float64, error), meterEnergy func() (float64, error), identifier func() (string, error)) api.Charger {
switch {
case chargeRater == nil && meter == nil && meterCurrent == nil && meterEnergy == nil:
case chargeRater == nil && identifier == nil && meter == nil && meterCurrent == nil && meterEnergy == nil:
return base
case chargeRater == nil && meter != nil && meterCurrent == nil && meterEnergy == nil:
case chargeRater == nil && identifier == nil && meter != nil && meterCurrent == nil && meterEnergy == nil:
return &struct {
*BenderCC
api.Meter
@ -22,7 +22,7 @@ func decorateBenderCC(base *BenderCC, meter func() (float64, error), meterCurren
},
}
case chargeRater == nil && meter == nil && meterCurrent != nil && meterEnergy == nil:
case chargeRater == nil && identifier == nil && meter == nil && meterCurrent != nil && meterEnergy == nil:
return &struct {
*BenderCC
api.MeterCurrent
@ -33,7 +33,7 @@ func decorateBenderCC(base *BenderCC, meter func() (float64, error), meterCurren
},
}
case chargeRater == nil && meter != nil && meterCurrent != nil && meterEnergy == nil:
case chargeRater == nil && identifier == nil && meter != nil && meterCurrent != nil && meterEnergy == nil:
return &struct {
*BenderCC
api.Meter
@ -48,7 +48,7 @@ func decorateBenderCC(base *BenderCC, meter func() (float64, error), meterCurren
},
}
case chargeRater != nil && meter == nil && meterCurrent == nil && meterEnergy == nil:
case chargeRater != nil && identifier == nil && meter == nil && meterCurrent == nil && meterEnergy == nil:
return &struct {
*BenderCC
api.ChargeRater
@ -59,7 +59,7 @@ func decorateBenderCC(base *BenderCC, meter func() (float64, error), meterCurren
},
}
case chargeRater != nil && meter != nil && meterCurrent == nil && meterEnergy == nil:
case chargeRater != nil && identifier == nil && meter != nil && meterCurrent == nil && meterEnergy == nil:
return &struct {
*BenderCC
api.ChargeRater
@ -74,7 +74,7 @@ func decorateBenderCC(base *BenderCC, meter func() (float64, error), meterCurren
},
}
case chargeRater != nil && meter == nil && meterCurrent != nil && meterEnergy == nil:
case chargeRater != nil && identifier == nil && meter == nil && meterCurrent != nil && meterEnergy == nil:
return &struct {
*BenderCC
api.ChargeRater
@ -89,7 +89,7 @@ func decorateBenderCC(base *BenderCC, meter func() (float64, error), meterCurren
},
}
case chargeRater != nil && meter != nil && meterCurrent != nil && meterEnergy == nil:
case chargeRater != nil && identifier == nil && meter != nil && meterCurrent != nil && meterEnergy == nil:
return &struct {
*BenderCC
api.ChargeRater
@ -108,7 +108,7 @@ func decorateBenderCC(base *BenderCC, meter func() (float64, error), meterCurren
},
}
case chargeRater == nil && meter == nil && meterCurrent == nil && meterEnergy != nil:
case chargeRater == nil && identifier == nil && meter == nil && meterCurrent == nil && meterEnergy != nil:
return &struct {
*BenderCC
api.MeterEnergy
@ -119,7 +119,7 @@ func decorateBenderCC(base *BenderCC, meter func() (float64, error), meterCurren
},
}
case chargeRater == nil && meter != nil && meterCurrent == nil && meterEnergy != nil:
case chargeRater == nil && identifier == nil && meter != nil && meterCurrent == nil && meterEnergy != nil:
return &struct {
*BenderCC
api.Meter
@ -134,7 +134,7 @@ func decorateBenderCC(base *BenderCC, meter func() (float64, error), meterCurren
},
}
case chargeRater == nil && meter == nil && meterCurrent != nil && meterEnergy != nil:
case chargeRater == nil && identifier == nil && meter == nil && meterCurrent != nil && meterEnergy != nil:
return &struct {
*BenderCC
api.MeterCurrent
@ -149,7 +149,7 @@ func decorateBenderCC(base *BenderCC, meter func() (float64, error), meterCurren
},
}
case chargeRater == nil && meter != nil && meterCurrent != nil && meterEnergy != nil:
case chargeRater == nil && identifier == nil && meter != nil && meterCurrent != nil && meterEnergy != nil:
return &struct {
*BenderCC
api.Meter
@ -168,7 +168,7 @@ func decorateBenderCC(base *BenderCC, meter func() (float64, error), meterCurren
},
}
case chargeRater != nil && meter == nil && meterCurrent == nil && meterEnergy != nil:
case chargeRater != nil && identifier == nil && meter == nil && meterCurrent == nil && meterEnergy != nil:
return &struct {
*BenderCC
api.ChargeRater
@ -183,7 +183,7 @@ func decorateBenderCC(base *BenderCC, meter func() (float64, error), meterCurren
},
}
case chargeRater != nil && meter != nil && meterCurrent == nil && meterEnergy != nil:
case chargeRater != nil && identifier == nil && meter != nil && meterCurrent == nil && meterEnergy != nil:
return &struct {
*BenderCC
api.ChargeRater
@ -202,7 +202,7 @@ func decorateBenderCC(base *BenderCC, meter func() (float64, error), meterCurren
},
}
case chargeRater != nil && meter == nil && meterCurrent != nil && meterEnergy != nil:
case chargeRater != nil && identifier == nil && meter == nil && meterCurrent != nil && meterEnergy != nil:
return &struct {
*BenderCC
api.ChargeRater
@ -221,7 +221,7 @@ func decorateBenderCC(base *BenderCC, meter func() (float64, error), meterCurren
},
}
case chargeRater != nil && meter != nil && meterCurrent != nil && meterEnergy != nil:
case chargeRater != nil && identifier == nil && meter != nil && meterCurrent != nil && meterEnergy != nil:
return &struct {
*BenderCC
api.ChargeRater
@ -243,6 +243,310 @@ func decorateBenderCC(base *BenderCC, meter func() (float64, error), meterCurren
meterEnergy: meterEnergy,
},
}
case chargeRater == nil && identifier != nil && meter == nil && meterCurrent == nil && meterEnergy == nil:
return &struct {
*BenderCC
api.Identifier
}{
BenderCC: base,
Identifier: &decorateBenderCCIdentifierImpl{
identifier: identifier,
},
}
case chargeRater == nil && identifier != nil && meter != nil && meterCurrent == nil && meterEnergy == nil:
return &struct {
*BenderCC
api.Identifier
api.Meter
}{
BenderCC: base,
Identifier: &decorateBenderCCIdentifierImpl{
identifier: identifier,
},
Meter: &decorateBenderCCMeterImpl{
meter: meter,
},
}
case chargeRater == nil && identifier != nil && meter == nil && meterCurrent != nil && meterEnergy == nil:
return &struct {
*BenderCC
api.Identifier
api.MeterCurrent
}{
BenderCC: base,
Identifier: &decorateBenderCCIdentifierImpl{
identifier: identifier,
},
MeterCurrent: &decorateBenderCCMeterCurrentImpl{
meterCurrent: meterCurrent,
},
}
case chargeRater == nil && identifier != nil && meter != nil && meterCurrent != nil && meterEnergy == nil:
return &struct {
*BenderCC
api.Identifier
api.Meter
api.MeterCurrent
}{
BenderCC: base,
Identifier: &decorateBenderCCIdentifierImpl{
identifier: identifier,
},
Meter: &decorateBenderCCMeterImpl{
meter: meter,
},
MeterCurrent: &decorateBenderCCMeterCurrentImpl{
meterCurrent: meterCurrent,
},
}
case chargeRater != nil && identifier != nil && meter == nil && meterCurrent == nil && meterEnergy == nil:
return &struct {
*BenderCC
api.ChargeRater
api.Identifier
}{
BenderCC: base,
ChargeRater: &decorateBenderCCChargeRaterImpl{
chargeRater: chargeRater,
},
Identifier: &decorateBenderCCIdentifierImpl{
identifier: identifier,
},
}
case chargeRater != nil && identifier != nil && meter != nil && meterCurrent == nil && meterEnergy == nil:
return &struct {
*BenderCC
api.ChargeRater
api.Identifier
api.Meter
}{
BenderCC: base,
ChargeRater: &decorateBenderCCChargeRaterImpl{
chargeRater: chargeRater,
},
Identifier: &decorateBenderCCIdentifierImpl{
identifier: identifier,
},
Meter: &decorateBenderCCMeterImpl{
meter: meter,
},
}
case chargeRater != nil && identifier != nil && meter == nil && meterCurrent != nil && meterEnergy == nil:
return &struct {
*BenderCC
api.ChargeRater
api.Identifier
api.MeterCurrent
}{
BenderCC: base,
ChargeRater: &decorateBenderCCChargeRaterImpl{
chargeRater: chargeRater,
},
Identifier: &decorateBenderCCIdentifierImpl{
identifier: identifier,
},
MeterCurrent: &decorateBenderCCMeterCurrentImpl{
meterCurrent: meterCurrent,
},
}
case chargeRater != nil && identifier != nil && meter != nil && meterCurrent != nil && meterEnergy == nil:
return &struct {
*BenderCC
api.ChargeRater
api.Identifier
api.Meter
api.MeterCurrent
}{
BenderCC: base,
ChargeRater: &decorateBenderCCChargeRaterImpl{
chargeRater: chargeRater,
},
Identifier: &decorateBenderCCIdentifierImpl{
identifier: identifier,
},
Meter: &decorateBenderCCMeterImpl{
meter: meter,
},
MeterCurrent: &decorateBenderCCMeterCurrentImpl{
meterCurrent: meterCurrent,
},
}
case chargeRater == nil && identifier != nil && meter == nil && meterCurrent == nil && meterEnergy != nil:
return &struct {
*BenderCC
api.Identifier
api.MeterEnergy
}{
BenderCC: base,
Identifier: &decorateBenderCCIdentifierImpl{
identifier: identifier,
},
MeterEnergy: &decorateBenderCCMeterEnergyImpl{
meterEnergy: meterEnergy,
},
}
case chargeRater == nil && identifier != nil && meter != nil && meterCurrent == nil && meterEnergy != nil:
return &struct {
*BenderCC
api.Identifier
api.Meter
api.MeterEnergy
}{
BenderCC: base,
Identifier: &decorateBenderCCIdentifierImpl{
identifier: identifier,
},
Meter: &decorateBenderCCMeterImpl{
meter: meter,
},
MeterEnergy: &decorateBenderCCMeterEnergyImpl{
meterEnergy: meterEnergy,
},
}
case chargeRater == nil && identifier != nil && meter == nil && meterCurrent != nil && meterEnergy != nil:
return &struct {
*BenderCC
api.Identifier
api.MeterCurrent
api.MeterEnergy
}{
BenderCC: base,
Identifier: &decorateBenderCCIdentifierImpl{
identifier: identifier,
},
MeterCurrent: &decorateBenderCCMeterCurrentImpl{
meterCurrent: meterCurrent,
},
MeterEnergy: &decorateBenderCCMeterEnergyImpl{
meterEnergy: meterEnergy,
},
}
case chargeRater == nil && identifier != nil && meter != nil && meterCurrent != nil && meterEnergy != nil:
return &struct {
*BenderCC
api.Identifier
api.Meter
api.MeterCurrent
api.MeterEnergy
}{
BenderCC: base,
Identifier: &decorateBenderCCIdentifierImpl{
identifier: identifier,
},
Meter: &decorateBenderCCMeterImpl{
meter: meter,
},
MeterCurrent: &decorateBenderCCMeterCurrentImpl{
meterCurrent: meterCurrent,
},
MeterEnergy: &decorateBenderCCMeterEnergyImpl{
meterEnergy: meterEnergy,
},
}
case chargeRater != nil && identifier != nil && meter == nil && meterCurrent == nil && meterEnergy != nil:
return &struct {
*BenderCC
api.ChargeRater
api.Identifier
api.MeterEnergy
}{
BenderCC: base,
ChargeRater: &decorateBenderCCChargeRaterImpl{
chargeRater: chargeRater,
},
Identifier: &decorateBenderCCIdentifierImpl{
identifier: identifier,
},
MeterEnergy: &decorateBenderCCMeterEnergyImpl{
meterEnergy: meterEnergy,
},
}
case chargeRater != nil && identifier != nil && meter != nil && meterCurrent == nil && meterEnergy != nil:
return &struct {
*BenderCC
api.ChargeRater
api.Identifier
api.Meter
api.MeterEnergy
}{
BenderCC: base,
ChargeRater: &decorateBenderCCChargeRaterImpl{
chargeRater: chargeRater,
},
Identifier: &decorateBenderCCIdentifierImpl{
identifier: identifier,
},
Meter: &decorateBenderCCMeterImpl{
meter: meter,
},
MeterEnergy: &decorateBenderCCMeterEnergyImpl{
meterEnergy: meterEnergy,
},
}
case chargeRater != nil && identifier != nil && meter == nil && meterCurrent != nil && meterEnergy != nil:
return &struct {
*BenderCC
api.ChargeRater
api.Identifier
api.MeterCurrent
api.MeterEnergy
}{
BenderCC: base,
ChargeRater: &decorateBenderCCChargeRaterImpl{
chargeRater: chargeRater,
},
Identifier: &decorateBenderCCIdentifierImpl{
identifier: identifier,
},
MeterCurrent: &decorateBenderCCMeterCurrentImpl{
meterCurrent: meterCurrent,
},
MeterEnergy: &decorateBenderCCMeterEnergyImpl{
meterEnergy: meterEnergy,
},
}
case chargeRater != nil && identifier != nil && meter != nil && meterCurrent != nil && meterEnergy != nil:
return &struct {
*BenderCC
api.ChargeRater
api.Identifier
api.Meter
api.MeterCurrent
api.MeterEnergy
}{
BenderCC: base,
ChargeRater: &decorateBenderCCChargeRaterImpl{
chargeRater: chargeRater,
},
Identifier: &decorateBenderCCIdentifierImpl{
identifier: identifier,
},
Meter: &decorateBenderCCMeterImpl{
meter: meter,
},
MeterCurrent: &decorateBenderCCMeterCurrentImpl{
meterCurrent: meterCurrent,
},
MeterEnergy: &decorateBenderCCMeterEnergyImpl{
meterEnergy: meterEnergy,
},
}
}
return nil
@ -256,6 +560,14 @@ func (impl *decorateBenderCCChargeRaterImpl) ChargedEnergy() (float64, error) {
return impl.chargeRater()
}
type decorateBenderCCIdentifierImpl struct {
identifier func() (string, error)
}
func (impl *decorateBenderCCIdentifierImpl) Identify() (string, error) {
return impl.identifier()
}
type decorateBenderCCMeterImpl struct {
meter func() (float64, error)
}