diff --git a/charger/evsewifi.go b/charger/evsewifi.go index db68da58cf..473226a9d9 100644 --- a/charger/evsewifi.go +++ b/charger/evsewifi.go @@ -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() diff --git a/charger/evsewifi_decorators.go b/charger/evsewifi_decorators.go index cd6a5e2181..ffa6361037 100644 --- a/charger/evsewifi_decorators.go +++ b/charger/evsewifi_decorators.go @@ -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) }