Nissan: move VIN from api to provider

This commit is contained in:
andig 2021-10-24 17:26:08 +02:00
parent e2c7cf9ef3
commit a5fb9d40c1
4 changed files with 22 additions and 23 deletions

View file

@ -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()
}

View file

@ -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
}

View file

@ -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{

View file

@ -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