From 0459b3c149ab165cb3c7ffb0c2d03af1710e79d5 Mon Sep 17 00:00:00 2001 From: andig Date: Mon, 1 May 2023 11:16:54 +0200 Subject: [PATCH] Tesla: support new api (#7749) --- go.mod | 2 +- go.sum | 10 ++--- vehicle/tesla.go | 96 +++++++++++++++++++++--------------------------- 3 files changed, 47 insertions(+), 61 deletions(-) diff --git a/go.mod b/go.mod index 92468fb463..b7ffc0a1e9 100644 --- a/go.mod +++ b/go.mod @@ -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 diff --git a/go.sum b/go.sum index ae40001a9e..df151fdac7 100644 --- a/go.sum +++ b/go.sum @@ -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= @@ -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= @@ -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= diff --git a/vehicle/tesla.go b/vehicle/tesla.go index 9eee564e26..2e2adff41e 100644 --- a/vehicle/tesla.go +++ b/vehicle/tesla.go @@ -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() { @@ -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 @@ -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 @@ -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. @@ -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)