Deduplicate charge state api (#728)
This commit is contained in:
parent
c77ea5fe3a
commit
eb6d7a1be1
8 changed files with 39 additions and 43 deletions
14
api/api.go
14
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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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],
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue