Skip to content

Commit

Permalink
Tesla: support new api (#7749)
Browse files Browse the repository at this point in the history
  • Loading branch information
andig authored May 1, 2023
1 parent 1b33b1e commit 0459b3c
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 61 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ require (
github.com/basgys/goxml2json v1.1.0
github.com/basvdlei/gotsmart v0.0.3
github.com/benbjohnson/clock v1.3.0
github.com/bogosj/tesla v1.1.0
github.com/bogosj/tesla v1.1.1-0.20230430222423-0d6e63ee90c9
github.com/cenkalti/backoff v2.2.1+incompatible
github.com/cjrd/allocate v0.0.0-20220510215731-986f24f0fb18
github.com/cloudfoundry/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21
Expand Down
10 changes: 5 additions & 5 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -266,8 +266,8 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB
github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y=
github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA=
github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w=
github.com/bogosj/tesla v1.1.0 h1:p+BOY8HGMT9GYOgvPM7Heu0d66TTkvDbVlVkErkbzDA=
github.com/bogosj/tesla v1.1.0/go.mod h1:Rh1oHqNrnEVsKvdlOPELq4sLa6Swsuj+lbmZDBk1kfM=
github.com/bogosj/tesla v1.1.1-0.20230430222423-0d6e63ee90c9 h1:Wd6BCHLS720MX1s2WHvu5Y7lo3HvRC/qONo7VbEbuac=
github.com/bogosj/tesla v1.1.1-0.20230430222423-0d6e63ee90c9/go.mod h1:eF5996x0SVG6eslBpMA5kEjT1j9Q5gHO3lqovDmZKls=
github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ=
github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4=
github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
Expand Down Expand Up @@ -568,8 +568,8 @@ github.com/googleapis/gax-go/v2 v2.8.0 h1:UBtEZqx1bjXtOQ5BVTkuYghXrr3N4V123VKJK6
github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI=
github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4=
github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g=
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4=
github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q=
Expand Down Expand Up @@ -997,9 +997,9 @@ github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVs
github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA=
github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs=
github.com/smartystreets/assertions v1.13.1 h1:Ef7KhSmjZcK6AVf9YbJdvPYG9avaF0ZxudX+ThRdWfU=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/smartystreets/goconvey v1.7.2 h1:9RBaZCeXEQ3UselpuwUQHltGVXvdwm6cv1hgR6gDIPg=
github.com/smartystreets/goconvey v1.8.0 h1:Oi49ha/2MURE0WexF052Z0m+BNSGirfjg5RL+JXWq3w=
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
Expand Down
96 changes: 41 additions & 55 deletions vehicle/tesla.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,8 @@ import (
// Tesla is an api.Vehicle implementation for Tesla cars
type Tesla struct {
*embed
vehicle *tesla.Vehicle
chargeStateG func() (*tesla.ChargeState, error)
vehicleStateG func() (*tesla.VehicleState, error)
driveStateG func() (*tesla.DriveState, error)
vehicle *tesla.Vehicle
dataG func() (*tesla.VehicleData, error)
}

func init() {
Expand Down Expand Up @@ -78,19 +76,17 @@ func NewTeslaFromConfig(other map[string]interface{}) (api.Vehicle, error) {
v.Title_ = v.vehicle.DisplayName
}

v.chargeStateG = provider.Cached(v.vehicle.ChargeState, cc.Cache)
v.vehicleStateG = provider.Cached(v.vehicle.VehicleState, cc.Cache)
v.driveStateG = provider.Cached(v.vehicle.DriveState, cc.Cache)
v.dataG = provider.Cached(v.vehicle.Data, cc.Cache)

return v, nil
}

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

if err == nil {
return float64(res.UsableBatteryLevel), nil
return float64(res.Response.ChargeState.UsableBatteryLevel), nil
}

return 0, err
Expand All @@ -101,31 +97,30 @@ var _ api.ChargeState = (*Tesla)(nil)
// Status implements the api.ChargeState interface
func (v *Tesla) Status() (api.ChargeStatus, error) {
status := api.StatusA // disconnected
res, err := v.chargeStateG()
res, err := v.dataG()
if err != nil {
return status, err
}

if err == nil {
if res.ChargingState == "Stopped" || res.ChargingState == "NoPower" || res.ChargingState == "Complete" {
status = api.StatusB
}
if res.ChargingState == "Charging" {
status = api.StatusC
}
switch res.Response.ChargeState.ChargingState {
case "Stopped", "NoPower", "Complete":
status = api.StatusB
case "Charging":
status = api.StatusC
}

return status, err
return status, nil
}

var _ api.ChargeRater = (*Tesla)(nil)

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

if err == nil {
return res.ChargeEnergyAdded, nil
res, err := v.dataG()
if err != nil {
return 0, err
}

return 0, err
return res.Response.ChargeState.ChargeEnergyAdded, nil
}

const kmPerMile = 1.609344
Expand All @@ -134,42 +129,35 @@ var _ api.VehicleRange = (*Tesla)(nil)

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

if err == nil {
// miles to km
return int64(kmPerMile * res.BatteryRange), nil
res, err := v.dataG()
if err != nil {
return 0, err
}

return 0, err
// miles to km
return int64(kmPerMile * res.Response.ChargeState.BatteryRange), nil
}

var _ api.VehicleOdometer = (*Tesla)(nil)

// Odometer implements the api.VehicleOdometer interface
func (v *Tesla) Odometer() (float64, error) {
res, err := v.vehicleStateG()

if err == nil {
// miles to km
return kmPerMile * res.Odometer, nil
res, err := v.dataG()
if err != nil {
return 0, err
}

return 0, err
// miles to km
return kmPerMile * res.Response.VehicleState.Odometer, nil
}

var _ api.VehicleFinishTimer = (*Tesla)(nil)

// FinishTime implements the api.VehicleFinishTimer interface
func (v *Tesla) FinishTime() (time.Time, error) {
res, err := v.chargeStateG()

if err == nil {
t := time.Now()
return t.Add(time.Duration(res.MinutesToFullCharge) * time.Minute), err
res, err := v.dataG()
if err != nil {
return time.Time{}, err
}

return time.Time{}, err
return time.Now().Add(time.Duration(res.Response.ChargeState.MinutesToFullCharge) * time.Minute), nil
}

// TODO api.Climater implementation has been removed as it drains battery. Re-check at a later time.
Expand All @@ -178,24 +166,22 @@ var _ api.VehiclePosition = (*Tesla)(nil)

// Position implements the api.VehiclePosition interface
func (v *Tesla) Position() (float64, float64, error) {
res, err := v.driveStateG()
if err == nil {
return res.Latitude, res.Longitude, nil
res, err := v.dataG()
if err != nil {
return 0, 0, err
}

return 0, 0, err
return res.Response.DriveState.Latitude, res.Response.DriveState.Longitude, nil
}

var _ api.SocLimiter = (*Tesla)(nil)

// TargetSoc implements the api.SocLimiter interface
func (v *Tesla) TargetSoc() (float64, error) {
res, err := v.chargeStateG()
if err == nil {
return float64(res.ChargeLimitSoc), nil
res, err := v.dataG()
if err != nil {
return 0, err
}

return 0, err
return float64(res.Response.ChargeState.ChargeLimitSoc), nil
}

var _ api.CurrentLimiter = (*Tesla)(nil)
Expand Down

0 comments on commit 0459b3c

Please sign in to comment.