Add Tesla range api (#770)
This commit is contained in:
parent
57495de286
commit
6d30bd2a4d
1 changed files with 31 additions and 22 deletions
|
|
@ -17,9 +17,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
|
||||
|
|
@ -96,36 +95,46 @@ 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
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue