Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
mark-sch committed Mar 17, 2021
2 parents c9f902d + 6d30bd2 commit b426828
Showing 1 changed file with 31 additions and 22 deletions.
53 changes: 31 additions & 22 deletions vehicle/tesla.go
Expand Up @@ -18,9 +18,8 @@ import (
// Tesla is an api.Vehicle implementation for Tesla cars
type Tesla struct {
*embed
vehicle *tesla.Vehicle
chargeStateG func() (float64, error)
chargedEnergyG func() (float64, error)
vehicle *tesla.Vehicle
chargeStateG func() (interface{}, error)
}

// teslaTokens contains access and refresh tokens
Expand Down Expand Up @@ -97,38 +96,48 @@ func NewTeslaFromConfig(other map[string]interface{}) (api.Vehicle, error) {
return nil, errors.New("vin not found")
}

v.chargeStateG = provider.NewCached(v.chargeState, cc.Cache).FloatGetter()
v.chargedEnergyG = provider.NewCached(v.chargedEnergy, cc.Cache).FloatGetter()
v.chargeStateG = provider.NewCached(v.chargeState, cc.Cache).InterfaceGetter()

return v, nil
}

// chargeState implements the api.Vehicle interface
func (v *Tesla) chargeState() (float64, error) {
state, err := v.vehicle.ChargeState()
if err != nil {
return 0, err
}
return float64(state.BatteryLevel), nil
// chargeState implements the charge state api
func (v *Tesla) chargeState() (interface{}, error) {
return v.vehicle.ChargeState()
}

// SoC implements the api.Vehicle interface
func (v *Tesla) SoC() (float64, error) {
return v.chargeStateG()
}
res, err := v.chargeStateG()

// chargedEnergy implements the ChargeRater.ChargedEnergy interface
func (v *Tesla) chargedEnergy() (float64, error) {
state, err := v.vehicle.ChargeState()
if err != nil {
return 0, err
if res, ok := res.(*tesla.ChargeState); err == nil && ok {
return float64(res.BatteryLevel), nil
}
return state.ChargeEnergyAdded, nil

return 0, err
}

// ChargedEnergy implements the ChargeRater.ChargedEnergy interface
// ChargedEnergy implements the api.ChargeRater interface
func (v *Tesla) ChargedEnergy() (float64, error) {
return v.chargedEnergyG()
res, err := v.chargeStateG()

if res, ok := res.(*tesla.ChargeState); err == nil && ok {
return float64(res.ChargeEnergyAdded), nil
}

return 0, err
}

// Range implements the api.VehicleRange interface
func (v *Tesla) Range() (int64, error) {
res, err := v.chargeStateG()

if res, ok := res.(*tesla.ChargeState); err == nil && ok {
// miles to km
return int64(1.609344 * res.EstBatteryRange), nil
}

return 0, err
}

// Status implements the api.ChargeState interface
Expand Down

0 comments on commit b426828

Please sign in to comment.