diff --git a/vehicle/bluelink/bluelink.go b/vehicle/bluelink/bluelink.go index d0e52fa46..dbaeb3531 100644 --- a/vehicle/bluelink/bluelink.go +++ b/vehicle/bluelink/bluelink.go @@ -81,6 +81,7 @@ type response struct { Value, Unit int } } + DrvDistance []drvDistance } Vehicles []struct { VehicleID string @@ -88,6 +89,14 @@ type response struct { } } +type drvDistance struct { + RangeByFuel struct { + EvModeRange struct { + Value int + } + } +} + // New creates a new BlueLink API func New(log *util.Logger, user, password string, cache time.Duration, config Config) (*API, error) { if err := mergo.Merge(&config, defaults); err != nil { @@ -336,7 +345,7 @@ func (v *API) statusAPI() (interface{}, error) { return res, err } -// ChargeState implements the Vehicle.ChargeState interface +// ChargeState implements the api.ChargeState interface func (v *API) ChargeState() (float64, error) { res, err := v.apiG() @@ -347,7 +356,7 @@ func (v *API) ChargeState() (float64, error) { return 0, err } -// FinishTime implements the Vehicle.ChargeFinishTimer interface +// FinishTime implements the api.ChargeFinishTimer interface func (v *API) FinishTime() (time.Time, error) { res, err := v.apiG() @@ -363,3 +372,18 @@ func (v *API) FinishTime() (time.Time, error) { return time.Time{}, err } + +// Range implements the api.VehicleRange interface +func (v *API) Range() (int64, error) { + res, err := v.apiG() + + if res, ok := res.(response); err == nil && ok { + if dist := res.ResMsg.EvStatus.DrvDistance; len(dist) == 1 { + return int64(dist[0].RangeByFuel.EvModeRange.Value), nil + } + + return 0, api.ErrNotAvailable + } + + return 0, err +}