From a5fb9d40c123f839ec2650d0b7c00f82f71365fb Mon Sep 17 00:00:00 2001 From: andig Date: Sun, 24 Oct 2021 17:26:08 +0200 Subject: [PATCH] Nissan: move VIN from api to provider --- vehicle/fiat/provider.go | 8 +++----- vehicle/nissan.go | 8 ++++---- vehicle/nissan/api.go | 16 +++++++--------- vehicle/nissan/provider.go | 13 ++++++++----- 4 files changed, 22 insertions(+), 23 deletions(-) diff --git a/vehicle/fiat/provider.go b/vehicle/fiat/provider.go index c0328bced..4d229a964 100644 --- a/vehicle/fiat/provider.go +++ b/vehicle/fiat/provider.go @@ -31,12 +31,10 @@ func NewProvider(api *API, vin, pin string, expiry, cache time.Duration) *Provid // use pin for refreshing if pin != "" { - statusG := func() (StatusResponse, error) { - return api.Status(vin) - } - impl.statusG = provider.NewCached(func() (interface{}, error) { - return impl.status(statusG) + return impl.status( + func() (StatusResponse, error) { return api.Status(vin) }, + ) }, cache).InterfaceGetter() } diff --git a/vehicle/nissan.go b/vehicle/nissan.go index 30739b127..18e49c19c 100644 --- a/vehicle/nissan.go +++ b/vehicle/nissan.go @@ -55,17 +55,17 @@ func NewNissanFromConfig(other map[string]interface{}) (api.Vehicle, error) { return v, fmt.Errorf("login failed: %w", err) } - api := nissan.NewAPI(log, identity, strings.ToUpper(cc.VIN)) + api := nissan.NewAPI(log, identity) var err error if cc.VIN == "" { - api.VIN, err = findVehicle(api.Vehicles()) + cc.VIN, err = findVehicle(api.Vehicles()) if err == nil { - log.DEBUG.Printf("found vehicle: %v", api.VIN) + log.DEBUG.Printf("found vehicle: %v", cc.VIN) } } - v.Provider = nissan.NewProvider(api, cc.Expiry, cc.Cache) + v.Provider = nissan.NewProvider(api, strings.ToUpper(cc.VIN), cc.Expiry, cc.Cache) return v, err } diff --git a/vehicle/nissan/api.go b/vehicle/nissan/api.go index 7d38d1f48..014344839 100644 --- a/vehicle/nissan/api.go +++ b/vehicle/nissan/api.go @@ -16,13 +16,11 @@ const ( type API struct { *request.Helper - VIN string } -func NewAPI(log *util.Logger, identity oauth2.TokenSource, vin string) *API { +func NewAPI(log *util.Logger, identity oauth2.TokenSource) *API { v := &API{ Helper: request.NewHelper(log), - VIN: vin, } // api is unbelievably slow when retrieving status @@ -61,8 +59,8 @@ func (v *API) Vehicles() ([]string, error) { const timeFormat = "2006-01-02T15:04:05Z" // Battery provides battery api response -func (v *API) BatteryStatus() (Response, error) { - uri := fmt.Sprintf("%s/v1/cars/%s/battery-status", CarAdapterBaseURL, v.VIN) +func (v *API) BatteryStatus(vin string) (Response, error) { + uri := fmt.Sprintf("%s/v1/cars/%s/battery-status", CarAdapterBaseURL, vin) var res Response err := v.GetJSON(uri, &res) @@ -71,9 +69,9 @@ func (v *API) BatteryStatus() (Response, error) { } // RefreshRequest requests battery status refresh -func (v *API) RefreshRequest(typ string) (Response, error) { +func (v *API) RefreshRequest(vin string, typ string) (Response, error) { var res Response - uri := fmt.Sprintf("%s/v1/cars/%s/actions/refresh-battery-status", CarAdapterBaseURL, v.VIN) + uri := fmt.Sprintf("%s/v1/cars/%s/actions/refresh-battery-status", CarAdapterBaseURL, vin) data := Request{ Data: Payload{ @@ -100,8 +98,8 @@ const ( ) // ChargingAction provides actions/charging-start api response -func (v *API) ChargingAction(action Action) (Response, error) { - uri := fmt.Sprintf("%s/v1/cars/%s/actions/charging-start", CarAdapterBaseURL, v.VIN) +func (v *API) ChargingAction(vin string, action Action) (Response, error) { + uri := fmt.Sprintf("%s/v1/cars/%s/actions/charging-start", CarAdapterBaseURL, vin) data := Request{ Data: Payload{ diff --git a/vehicle/nissan/provider.go b/vehicle/nissan/provider.go index fbe5079ed..618b65cf8 100644 --- a/vehicle/nissan/provider.go +++ b/vehicle/nissan/provider.go @@ -19,23 +19,26 @@ type Provider struct { } // NewProvider returns a kamereon provider -func NewProvider(api *API, expiry, cache time.Duration) *Provider { +func NewProvider(api *API, vin string, expiry, cache time.Duration) *Provider { impl := &Provider{ action: func(value Action) error { - _, err := api.ChargingAction(value) + _, err := api.ChargingAction(vin, value) return err }, expiry: expiry, } impl.statusG = provider.NewCached(func() (interface{}, error) { - return impl.status(api.BatteryStatus, api.RefreshRequest) + return impl.status( + func() (Response, error) { return api.BatteryStatus(vin) }, + func() (Response, error) { return api.RefreshRequest(vin, "RefreshBatteryStatus") }, + ) }, cache).InterfaceGetter() return impl } -func (v *Provider) status(battery func() (Response, error), refresh func(string) (Response, error)) (Response, error) { +func (v *Provider) status(battery func() (Response, error), refresh func() (Response, error)) (Response, error) { res, err := battery() var ts time.Time @@ -52,7 +55,7 @@ func (v *Provider) status(battery func() (Response, error), refresh func(string) // request a refresh, irrespective of a previous error if v.refreshID == "" { var refreshRes Response - if refreshRes, err = refresh("RefreshBatteryStatus"); err == nil { + if refreshRes, err = refresh(); err == nil { err = api.ErrMustRetry v.refreshID = refreshRes.Data.ID