EVSEWifi: add identifier api (#1168)

This commit is contained in:
andig 2021-06-22 14:46:17 +02:00 • committed by GitHub
parent c891477ba7
commit 52e2bcb43e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 344 additions and 19 deletions

View file

@ -44,6 +44,7 @@ type EVSEListEntry struct {
CurrentP1 float64 `json:"currentP1"`
CurrentP2 float64 `json:"currentP2"`
CurrentP3 float64 `json:"currentP3"`
RFIDUID *string `json:"RFIDUID"`
}
// EVSEWifi charger implementation
@ -60,7 +61,7 @@ func init() {
registry.Add("evsewifi", NewEVSEWifiFromConfig)
}
// go:generate go run ../cmd/tools/decorate.go -f decorateEVSE -b *EVSEWifi -r api.Charger -t "api.Meter,CurrentPower,func() (float64, error)" -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" -t "api.MeterCurrent,Currents,func() (float64, float64, float64, error)" -t "api.ChargerEx,MaxCurrentMillis,func(current float64) error"
// go:generate go run ../cmd/tools/decorate.go -f decorateEVSE -b *EVSEWifi -r api.Charger -t "api.Meter,CurrentPower,func() (float64, error)" -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" -t "api.MeterCurrent,Currents,func() (float64, float64, float64, error)" -t "api.ChargerEx,MaxCurrentMillis,func(current float64) error" -t "api.Identifier,Identify,func() (string, error)"
// NewEVSEWifiFromConfig creates a EVSEWifi charger from generic config
func NewEVSEWifiFromConfig(other map[string]interface{}) (api.Charger, error) {
@ -121,7 +122,13 @@ func NewEVSEWifiFromConfig(other map[string]interface{}) (api.Charger, error) {
evse.current = 100 * evse.current
}
return decorateEVSE(evse, currentPower, totalEnergy, currents, maxCurrentEx), nil
// decorate Charger with Identifier
var identify func() (string, error)
if params.RFIDUID != nil {
identify = evse.identify
}
return decorateEVSE(evse, currentPower, totalEnergy, currents, maxCurrentEx, identify), nil
}
// NewEVSEWifi creates EVSEWifi charger
@ -259,6 +266,12 @@ func (evse *EVSEWifi) currents() (float64, float64, float64, error) {
return float64(params.CurrentP1), float64(params.CurrentP2), float64(params.CurrentP3), err
}
// Identify implements the api.Identifier interface
func (evse *EVSEWifi) identify() (string, error) {
params, err := evse.getParameters()
return *params.RFIDUID, err
}
// // ChargedEnergy implements the ChargeRater interface
// func (evse *EVSEWifi) ChargedEnergy() (float64, error) {
// params, err := evse.getParameters()

View file

@ -6,12 +6,12 @@ import (
"github.com/andig/evcc/api"
)
func decorateEVSE(base *EVSEWifi, meter func() (float64, error), meterEnergy func() (float64, error), meterCurrent func() (float64, float64, float64, error), chargerEx func(current float64) error) api.Charger {
func decorateEVSE(base *EVSEWifi, meter func() (float64, error), meterEnergy func() (float64, error), meterCurrent func() (float64, float64, float64, error), chargerEx func(float64) error, identifier func() (string, error)) api.Charger {
switch {
case chargerEx == nil && meter == nil && meterCurrent == nil && meterEnergy == nil:
case chargerEx == nil && identifier == nil && meter == nil && meterCurrent == nil && meterEnergy == nil:
return base
case chargerEx == nil && meter != nil && meterCurrent == nil && meterEnergy == nil:
case chargerEx == nil && identifier == nil && meter != nil && meterCurrent == nil && meterEnergy == nil:
return &struct {
*EVSEWifi
api.Meter
@ -22,7 +22,7 @@ func decorateEVSE(base *EVSEWifi, meter func() (float64, error), meterEnergy fun
},
}
case chargerEx == nil && meter == nil && meterCurrent == nil && meterEnergy != nil:
case chargerEx == nil && identifier == nil && meter == nil && meterCurrent == nil && meterEnergy != nil:
return &struct {
*EVSEWifi
api.MeterEnergy
@ -33,7 +33,7 @@ func decorateEVSE(base *EVSEWifi, meter func() (float64, error), meterEnergy fun
},
}
case chargerEx == nil && meter != nil && meterCurrent == nil && meterEnergy != nil:
case chargerEx == nil && identifier == nil && meter != nil && meterCurrent == nil && meterEnergy != nil:
return &struct {
*EVSEWifi
api.Meter
@ -48,7 +48,7 @@ func decorateEVSE(base *EVSEWifi, meter func() (float64, error), meterEnergy fun
},
}
case chargerEx == nil && meter == nil && meterCurrent != nil && meterEnergy == nil:
case chargerEx == nil && identifier == nil && meter == nil && meterCurrent != nil && meterEnergy == nil:
return &struct {
*EVSEWifi
api.MeterCurrent
@ -59,7 +59,7 @@ func decorateEVSE(base *EVSEWifi, meter func() (float64, error), meterEnergy fun
},
}
case chargerEx == nil && meter != nil && meterCurrent != nil && meterEnergy == nil:
case chargerEx == nil && identifier == nil && meter != nil && meterCurrent != nil && meterEnergy == nil:
return &struct {
*EVSEWifi
api.Meter
@ -74,7 +74,7 @@ func decorateEVSE(base *EVSEWifi, meter func() (float64, error), meterEnergy fun
},
}
case chargerEx == nil && meter == nil && meterCurrent != nil && meterEnergy != nil:
case chargerEx == nil && identifier == nil && meter == nil && meterCurrent != nil && meterEnergy != nil:
return &struct {
*EVSEWifi
api.MeterCurrent
@ -89,7 +89,7 @@ func decorateEVSE(base *EVSEWifi, meter func() (float64, error), meterEnergy fun
},
}
case chargerEx == nil && meter != nil && meterCurrent != nil && meterEnergy != nil:
case chargerEx == nil && identifier == nil && meter != nil && meterCurrent != nil && meterEnergy != nil:
return &struct {
*EVSEWifi
api.Meter
@ -108,7 +108,7 @@ func decorateEVSE(base *EVSEWifi, meter func() (float64, error), meterEnergy fun
},
}
case chargerEx != nil && meter == nil && meterCurrent == nil && meterEnergy == nil:
case chargerEx != nil && identifier == nil && meter == nil && meterCurrent == nil && meterEnergy == nil:
return &struct {
*EVSEWifi
api.ChargerEx
@ -119,7 +119,7 @@ func decorateEVSE(base *EVSEWifi, meter func() (float64, error), meterEnergy fun
},
}
case chargerEx != nil && meter != nil && meterCurrent == nil && meterEnergy == nil:
case chargerEx != nil && identifier == nil && meter != nil && meterCurrent == nil && meterEnergy == nil:
return &struct {
*EVSEWifi
api.ChargerEx
@ -134,7 +134,7 @@ func decorateEVSE(base *EVSEWifi, meter func() (float64, error), meterEnergy fun
},
}
case chargerEx != nil && meter == nil && meterCurrent == nil && meterEnergy != nil:
case chargerEx != nil && identifier == nil && meter == nil && meterCurrent == nil && meterEnergy != nil:
return &struct {
*EVSEWifi
api.ChargerEx
@ -149,7 +149,7 @@ func decorateEVSE(base *EVSEWifi, meter func() (float64, error), meterEnergy fun
},
}
case chargerEx != nil && meter != nil && meterCurrent == nil && meterEnergy != nil:
case chargerEx != nil && identifier == nil && meter != nil && meterCurrent == nil && meterEnergy != nil:
return &struct {
*EVSEWifi
api.ChargerEx
@ -168,7 +168,7 @@ func decorateEVSE(base *EVSEWifi, meter func() (float64, error), meterEnergy fun
},
}
case chargerEx != nil && meter == nil && meterCurrent != nil && meterEnergy == nil:
case chargerEx != nil && identifier == nil && meter == nil && meterCurrent != nil && meterEnergy == nil:
return &struct {
*EVSEWifi
api.ChargerEx
@ -183,7 +183,7 @@ func decorateEVSE(base *EVSEWifi, meter func() (float64, error), meterEnergy fun
},
}
case chargerEx != nil && meter != nil && meterCurrent != nil && meterEnergy == nil:
case chargerEx != nil && identifier == nil && meter != nil && meterCurrent != nil && meterEnergy == nil:
return &struct {
*EVSEWifi
api.ChargerEx
@ -202,7 +202,7 @@ func decorateEVSE(base *EVSEWifi, meter func() (float64, error), meterEnergy fun
},
}
case chargerEx != nil && meter == nil && meterCurrent != nil && meterEnergy != nil:
case chargerEx != nil && identifier == nil && meter == nil && meterCurrent != nil && meterEnergy != nil:
return &struct {
*EVSEWifi
api.ChargerEx
@ -221,7 +221,7 @@ func decorateEVSE(base *EVSEWifi, meter func() (float64, error), meterEnergy fun
},
}
case chargerEx != nil && meter != nil && meterCurrent != nil && meterEnergy != nil:
case chargerEx != nil && identifier == nil && meter != nil && meterCurrent != nil && meterEnergy != nil:
return &struct {
*EVSEWifi
api.ChargerEx
@ -243,6 +243,310 @@ func decorateEVSE(base *EVSEWifi, meter func() (float64, error), meterEnergy fun
meterEnergy: meterEnergy,
},
}
case chargerEx == nil && identifier != nil && meter == nil && meterCurrent == nil && meterEnergy == nil:
return &struct {
*EVSEWifi
api.Identifier
}{
EVSEWifi: base,
Identifier: &decorateEVSEIdentifierImpl{
identifier: identifier,
},
}
case chargerEx == nil && identifier != nil && meter != nil && meterCurrent == nil && meterEnergy == nil:
return &struct {
*EVSEWifi
api.Identifier
api.Meter
}{
EVSEWifi: base,
Identifier: &decorateEVSEIdentifierImpl{
identifier: identifier,
},
Meter: &decorateEVSEMeterImpl{
meter: meter,
},
}
case chargerEx == nil && identifier != nil && meter == nil && meterCurrent == nil && meterEnergy != nil:
return &struct {
*EVSEWifi
api.Identifier
api.MeterEnergy
}{
EVSEWifi: base,
Identifier: &decorateEVSEIdentifierImpl{
identifier: identifier,
},
MeterEnergy: &decorateEVSEMeterEnergyImpl{
meterEnergy: meterEnergy,
},
}
case chargerEx == nil && identifier != nil && meter != nil && meterCurrent == nil && meterEnergy != nil:
return &struct {
*EVSEWifi
api.Identifier
api.Meter
api.MeterEnergy
}{
EVSEWifi: base,
Identifier: &decorateEVSEIdentifierImpl{
identifier: identifier,
},
Meter: &decorateEVSEMeterImpl{
meter: meter,
},
MeterEnergy: &decorateEVSEMeterEnergyImpl{
meterEnergy: meterEnergy,
},
}
case chargerEx == nil && identifier != nil && meter == nil && meterCurrent != nil && meterEnergy == nil:
return &struct {
*EVSEWifi
api.Identifier
api.MeterCurrent
}{
EVSEWifi: base,
Identifier: &decorateEVSEIdentifierImpl{
identifier: identifier,
},
MeterCurrent: &decorateEVSEMeterCurrentImpl{
meterCurrent: meterCurrent,
},
}
case chargerEx == nil && identifier != nil && meter != nil && meterCurrent != nil && meterEnergy == nil:
return &struct {
*EVSEWifi
api.Identifier
api.Meter
api.MeterCurrent
}{
EVSEWifi: base,
Identifier: &decorateEVSEIdentifierImpl{
identifier: identifier,
},
Meter: &decorateEVSEMeterImpl{
meter: meter,
},
MeterCurrent: &decorateEVSEMeterCurrentImpl{
meterCurrent: meterCurrent,
},
}
case chargerEx == nil && identifier != nil && meter == nil && meterCurrent != nil && meterEnergy != nil:
return &struct {
*EVSEWifi
api.Identifier
api.MeterCurrent
api.MeterEnergy
}{
EVSEWifi: base,
Identifier: &decorateEVSEIdentifierImpl{
identifier: identifier,
},
MeterCurrent: &decorateEVSEMeterCurrentImpl{
meterCurrent: meterCurrent,
},
MeterEnergy: &decorateEVSEMeterEnergyImpl{
meterEnergy: meterEnergy,
},
}
case chargerEx == nil && identifier != nil && meter != nil && meterCurrent != nil && meterEnergy != nil:
return &struct {
*EVSEWifi
api.Identifier
api.Meter
api.MeterCurrent
api.MeterEnergy
}{
EVSEWifi: base,
Identifier: &decorateEVSEIdentifierImpl{
identifier: identifier,
},
Meter: &decorateEVSEMeterImpl{
meter: meter,
},
MeterCurrent: &decorateEVSEMeterCurrentImpl{
meterCurrent: meterCurrent,
},
MeterEnergy: &decorateEVSEMeterEnergyImpl{
meterEnergy: meterEnergy,
},
}
case chargerEx != nil && identifier != nil && meter == nil && meterCurrent == nil && meterEnergy == nil:
return &struct {
*EVSEWifi
api.ChargerEx
api.Identifier
}{
EVSEWifi: base,
ChargerEx: &decorateEVSEChargerExImpl{
chargerEx: chargerEx,
},
Identifier: &decorateEVSEIdentifierImpl{
identifier: identifier,
},
}
case chargerEx != nil && identifier != nil && meter != nil && meterCurrent == nil && meterEnergy == nil:
return &struct {
*EVSEWifi
api.ChargerEx
api.Identifier
api.Meter
}{
EVSEWifi: base,
ChargerEx: &decorateEVSEChargerExImpl{
chargerEx: chargerEx,
},
Identifier: &decorateEVSEIdentifierImpl{
identifier: identifier,
},
Meter: &decorateEVSEMeterImpl{
meter: meter,
},
}
case chargerEx != nil && identifier != nil && meter == nil && meterCurrent == nil && meterEnergy != nil:
return &struct {
*EVSEWifi
api.ChargerEx
api.Identifier
api.MeterEnergy
}{
EVSEWifi: base,
ChargerEx: &decorateEVSEChargerExImpl{
chargerEx: chargerEx,
},
Identifier: &decorateEVSEIdentifierImpl{
identifier: identifier,
},
MeterEnergy: &decorateEVSEMeterEnergyImpl{
meterEnergy: meterEnergy,
},
}
case chargerEx != nil && identifier != nil && meter != nil && meterCurrent == nil && meterEnergy != nil:
return &struct {
*EVSEWifi
api.ChargerEx
api.Identifier
api.Meter
api.MeterEnergy
}{
EVSEWifi: base,
ChargerEx: &decorateEVSEChargerExImpl{
chargerEx: chargerEx,
},
Identifier: &decorateEVSEIdentifierImpl{
identifier: identifier,
},
Meter: &decorateEVSEMeterImpl{
meter: meter,
},
MeterEnergy: &decorateEVSEMeterEnergyImpl{
meterEnergy: meterEnergy,
},
}
case chargerEx != nil && identifier != nil && meter == nil && meterCurrent != nil && meterEnergy == nil:
return &struct {
*EVSEWifi
api.ChargerEx
api.Identifier
api.MeterCurrent
}{
EVSEWifi: base,
ChargerEx: &decorateEVSEChargerExImpl{
chargerEx: chargerEx,
},
Identifier: &decorateEVSEIdentifierImpl{
identifier: identifier,
},
MeterCurrent: &decorateEVSEMeterCurrentImpl{
meterCurrent: meterCurrent,
},
}
case chargerEx != nil && identifier != nil && meter != nil && meterCurrent != nil && meterEnergy == nil:
return &struct {
*EVSEWifi
api.ChargerEx
api.Identifier
api.Meter
api.MeterCurrent
}{
EVSEWifi: base,
ChargerEx: &decorateEVSEChargerExImpl{
chargerEx: chargerEx,
},
Identifier: &decorateEVSEIdentifierImpl{
identifier: identifier,
},
Meter: &decorateEVSEMeterImpl{
meter: meter,
},
MeterCurrent: &decorateEVSEMeterCurrentImpl{
meterCurrent: meterCurrent,
},
}
case chargerEx != nil && identifier != nil && meter == nil && meterCurrent != nil && meterEnergy != nil:
return &struct {
*EVSEWifi
api.ChargerEx
api.Identifier
api.MeterCurrent
api.MeterEnergy
}{
EVSEWifi: base,
ChargerEx: &decorateEVSEChargerExImpl{
chargerEx: chargerEx,
},
Identifier: &decorateEVSEIdentifierImpl{
identifier: identifier,
},
MeterCurrent: &decorateEVSEMeterCurrentImpl{
meterCurrent: meterCurrent,
},
MeterEnergy: &decorateEVSEMeterEnergyImpl{
meterEnergy: meterEnergy,
},
}
case chargerEx != nil && identifier != nil && meter != nil && meterCurrent != nil && meterEnergy != nil:
return &struct {
*EVSEWifi
api.ChargerEx
api.Identifier
api.Meter
api.MeterCurrent
api.MeterEnergy
}{
EVSEWifi: base,
ChargerEx: &decorateEVSEChargerExImpl{
chargerEx: chargerEx,
},
Identifier: &decorateEVSEIdentifierImpl{
identifier: identifier,
},
Meter: &decorateEVSEMeterImpl{
meter: meter,
},
MeterCurrent: &decorateEVSEMeterCurrentImpl{
meterCurrent: meterCurrent,
},
MeterEnergy: &decorateEVSEMeterEnergyImpl{
meterEnergy: meterEnergy,
},
}
}
return nil
@ -256,6 +560,14 @@ func (impl *decorateEVSEChargerExImpl) MaxCurrentMillis(current float64) error {
return impl.chargerEx(current)
}
type decorateEVSEIdentifierImpl struct {
identifier func() (string, error)
}
func (impl *decorateEVSEIdentifierImpl) Identify() (string, error) {
return impl.identifier()
}
type decorateEVSEMeterImpl struct {
meter func() (float64, error)
}