From eb6d7a1be1ecb22e43e1c7771c0e59d696233cd7 Mon Sep 17 00:00:00 2001 From: andig Date: Sun, 7 Mar 2021 18:34:34 +0100 Subject: [PATCH] Deduplicate charge state api (#728) --- api/api.go | 14 ++++++------ cmd/dumper.go | 16 +++++--------- core/loadpoint.go | 4 ++-- core/site.go | 2 +- vehicle/psa/provider.go | 2 +- vehicle/vehicle.go | 2 +- vehicle/vehicle_decorators.go | 40 +++++++++++++++++------------------ vehicle/vw/provider.go | 2 +- 8 files changed, 39 insertions(+), 43 deletions(-) diff --git a/api/api.go b/api/api.go index 0dd8b9903..bb6c56dd0 100644 --- a/api/api.go +++ b/api/api.go @@ -7,6 +7,7 @@ import "time" // ChargeMode are charge modes modeled after OpenWB type ChargeMode string +// Charge modes const ( ModeOff ChargeMode = "off" ModeNow ChargeMode = "now" @@ -22,6 +23,7 @@ func (c ChargeMode) String() string { // ChargeStatus is the EV's charging status from A to F type ChargeStatus string +// Charging states const ( StatusNone ChargeStatus = "" StatusA ChargeStatus = "A" // Fzg. angeschlossen: nein Laden aktiv: nein - Kabel nicht angeschlossen @@ -57,9 +59,14 @@ type Battery interface { SoC() (float64, error) } +// ChargeState provides current charging status +type ChargeState interface { + Status() (ChargeStatus, error) +} + // Charger is able to provide current charging status and to enable/disabler charging type Charger interface { - Status() (ChargeStatus, error) + ChargeState Enabled() (bool, error) Enable(enable bool) error MaxCurrent(current int64) error @@ -97,11 +104,6 @@ type VehicleFinishTimer interface { FinishTime() (time.Time, error) } -// VehicleStatus provides the vehicles current charging status -type VehicleStatus interface { - Status() (ChargeStatus, error) -} - // VehicleRange provides the vehicles remaining km range type VehicleRange interface { Range() (int64, error) diff --git a/cmd/dumper.go b/cmd/dumper.go index 80b689964..2cd64f6b3 100644 --- a/cmd/dumper.go +++ b/cmd/dumper.go @@ -73,13 +73,15 @@ func (d *dumper) Dump(name string, v interface{}) { // charger - if v, ok := v.(api.Charger); ok { + if v, ok := v.(api.ChargeState); ok { if status, err := v.Status(); err != nil { - fmt.Fprintf(w, "Status:\t%v\n", err) + fmt.Fprintf(w, "Charge status:\t%v\n", err) } else { - fmt.Fprintf(w, "Status:\t%s\n", status) + fmt.Fprintf(w, "Charge status:\t%v\n", status) } + } + if v, ok := v.(api.Charger); ok { if enabled, err := v.Enabled(); err != nil { fmt.Fprintf(w, "Enabled:\t%v\n", err) } else { @@ -123,14 +125,6 @@ func (d *dumper) Dump(name string, v interface{}) { } } - if v, ok := v.(api.VehicleStatus); ok { - if status, err := v.Status(); err != nil { - fmt.Fprintf(w, "Charge status:\t%v\n", err) - } else { - fmt.Fprintf(w, "Charge status:\t%v\n", status) - } - } - if v, ok := v.(api.VehicleFinishTimer); ok { if ft, err := v.FinishTime(); err != nil { fmt.Fprintf(w, "Finish time:\t%v\n", err) diff --git a/core/loadpoint.go b/core/loadpoint.go index 7e1bc26f0..ae3604d1d 100644 --- a/core/loadpoint.go +++ b/core/loadpoint.go @@ -572,7 +572,7 @@ func (lp *LoadPoint) findActiveVehicle() { return } - if vs, ok := lp.vehicle.(api.VehicleStatus); ok { + if vs, ok := lp.vehicle.(api.ChargeState); ok { status, err := vs.Status() if err == nil { @@ -588,7 +588,7 @@ func (lp *LoadPoint) findActiveVehicle() { continue } - if vs, ok := vehicle.(api.VehicleStatus); ok { + if vs, ok := vehicle.(api.ChargeState); ok { status, err := vs.Status() if err == nil { diff --git a/core/site.go b/core/site.go index 556f8415c..cc8d9d313 100644 --- a/core/site.go +++ b/core/site.go @@ -189,7 +189,7 @@ func (site *Site) DumpConfig() { for i, v := range lp.vehicles { _, rng := v.(api.VehicleRange) _, finish := v.(api.VehicleFinishTimer) - _, status := v.(api.VehicleStatus) + _, status := v.(api.ChargeState) _, climate := v.(api.VehicleClimater) lp.log.INFO.Printf(" car %d: range %s finish %s status %s climate %s", i, presence[rng], presence[finish], presence[status], presence[climate], diff --git a/vehicle/psa/provider.go b/vehicle/psa/provider.go index 01cff73b6..a0583fb97 100644 --- a/vehicle/psa/provider.go +++ b/vehicle/psa/provider.go @@ -66,7 +66,7 @@ func (v *Provider) FinishTime() (time.Time, error) { return time.Time{}, err } -// Status implements the api.VehicleStatus interface +// Status implements the api.ChargeState interface func (v *Provider) Status() (api.ChargeStatus, error) { res, err := v.statusG() if res, ok := res.(Status); err == nil && ok { diff --git a/vehicle/vehicle.go b/vehicle/vehicle.go index 98fc58207..d32826479 100644 --- a/vehicle/vehicle.go +++ b/vehicle/vehicle.go @@ -24,7 +24,7 @@ func (m *embed) Capacity() int64 { return m.capacity } -//go:generate go run ../cmd/tools/decorate.go -p vehicle -f decorateVehicle -b api.Vehicle -o vehicle_decorators -t "api.VehicleStatus,Status,func() (api.ChargeStatus, error)" -t "api.VehicleRange,Range,func() (int64, error)" +//go:generate go run ../cmd/tools/decorate.go -p vehicle -f decorateVehicle -b api.Vehicle -o vehicle_decorators -t "api.ChargeState,Status,func() (api.ChargeStatus, error)" -t "api.VehicleRange,Range,func() (int64, error)" // Vehicle is an api.Vehicle implementation with configurable getters and setters. type Vehicle struct { diff --git a/vehicle/vehicle_decorators.go b/vehicle/vehicle_decorators.go index ae01c369b..f8eea9501 100644 --- a/vehicle/vehicle_decorators.go +++ b/vehicle/vehicle_decorators.go @@ -6,23 +6,23 @@ import ( "github.com/andig/evcc/api" ) -func decorateVehicle(base api.Vehicle, vehicleStatus func() (api.ChargeStatus, error), vehicleRange func() (int64, error)) api.Vehicle { +func decorateVehicle(base api.Vehicle, chargeState func() (api.ChargeStatus, error), vehicleRange func() (int64, error)) api.Vehicle { switch { - case vehicleRange == nil && vehicleStatus == nil: + case chargeState == nil && vehicleRange == nil: return base - case vehicleRange == nil && vehicleStatus != nil: + case chargeState != nil && vehicleRange == nil: return &struct { api.Vehicle - api.VehicleStatus + api.ChargeState }{ Vehicle: base, - VehicleStatus: &decorateVehicleVehicleStatusImpl{ - vehicleStatus: vehicleStatus, + ChargeState: &decorateVehicleChargeStateImpl{ + chargeState: chargeState, }, } - case vehicleRange != nil && vehicleStatus == nil: + case chargeState == nil && vehicleRange != nil: return &struct { api.Vehicle api.VehicleRange @@ -33,25 +33,33 @@ func decorateVehicle(base api.Vehicle, vehicleStatus func() (api.ChargeStatus, e }, } - case vehicleRange != nil && vehicleStatus != nil: + case chargeState != nil && vehicleRange != nil: return &struct { api.Vehicle + api.ChargeState api.VehicleRange - api.VehicleStatus }{ Vehicle: base, + ChargeState: &decorateVehicleChargeStateImpl{ + chargeState: chargeState, + }, VehicleRange: &decorateVehicleVehicleRangeImpl{ vehicleRange: vehicleRange, }, - VehicleStatus: &decorateVehicleVehicleStatusImpl{ - vehicleStatus: vehicleStatus, - }, } } return nil } +type decorateVehicleChargeStateImpl struct { + chargeState func() (api.ChargeStatus, error) +} + +func (impl *decorateVehicleChargeStateImpl) Status() (api.ChargeStatus, error) { + return impl.chargeState() +} + type decorateVehicleVehicleRangeImpl struct { vehicleRange func() (int64, error) } @@ -59,11 +67,3 @@ type decorateVehicleVehicleRangeImpl struct { func (impl *decorateVehicleVehicleRangeImpl) Range() (int64, error) { return impl.vehicleRange() } - -type decorateVehicleVehicleStatusImpl struct { - vehicleStatus func() (api.ChargeStatus, error) -} - -func (impl *decorateVehicleVehicleStatusImpl) Status() (api.ChargeStatus, error) { - return impl.vehicleStatus() -} diff --git a/vehicle/vw/provider.go b/vehicle/vw/provider.go index 62d55c440..100c70d8a 100644 --- a/vehicle/vw/provider.go +++ b/vehicle/vw/provider.go @@ -37,7 +37,7 @@ func (v *Provider) SoC() (float64, error) { return 0, err } -// Status implements the api.VehicleStatus interface +// Status implements the api.ChargeState interface func (v *Provider) Status() (api.ChargeStatus, error) { status := api.StatusA // disconnected