Deduplicate charge state api (#728)

This commit is contained in:
andig 2021-03-07 18:34:34 +01:00 • committed by GitHub
parent c77ea5fe3a
commit eb6d7a1be1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 39 additions and 43 deletions

View file

@ -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)

View file

@ -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)

View file

@ -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 {

View file

@ -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],

View file

@ -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 {

View file

@ -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 {

View file

@ -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()
}

View file

@ -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