From 85ef96c574c745917790b442d9ac56eb02745c20 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 3 Jul 2022 11:08:06 +0200 Subject: [PATCH] Renault: error if not paired or connected to driver (#3668) --- .gitignore | 1 + vehicle/renault.go | 55 ++++++++++++++++++++++++++++++---------------- 2 files changed, 37 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index ca7f7a178b..e678bbf63e 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,4 @@ server-key.pem ca-key.pem cmd/wip fly.toml +.idea diff --git a/vehicle/renault.go b/vehicle/renault.go index 781d3b2c2b..f8704f0340 100644 --- a/vehicle/renault.go +++ b/vehicle/renault.go @@ -69,9 +69,26 @@ type kamereonAccount struct { } type kamereonVehicle struct { - Brand string `json:"brand"` - VIN string `json:"vin"` - Status string `json:"status"` + Brand string `json:"brand"` + VIN string `json:"vin"` + Status string `json:"status"` + ConnectedDriver connectedDriver `json:"ConnectedDriver"` +} + +func (v *kamereonVehicle) Available() error { + if strings.ToUpper(v.Status) != "ACTIVE" { + return errors.New("vehicle is not active") + } + + if len(v.ConnectedDriver.Role) == 0 { + return errors.New("vehicle is not connected to driver") + } + + return nil +} + +type connectedDriver struct { + Role string `json:"role"` } type kamereonData struct { @@ -145,10 +162,20 @@ func NewRenaultFromConfig(other map[string]interface{}) (api.Vehicle, error) { err = v.authFlow() } + var car kamereonVehicle if err == nil { - v.vin, err = ensureVehicle(cc.VIN, func() ([]string, error) { - return v.kamereonVehicles(v.accountID) - }) + v.vin, car, err = ensureVehicleWithFeature(cc.VIN, + func() ([]kamereonVehicle, error) { + return v.kamereonVehicles(v.accountID) + }, + func(v kamereonVehicle) (string, kamereonVehicle) { + return v.VIN, v + }, + ) + } + + if err == nil { + err = car.Available() } v.batteryG = provider.Cached(v.batteryAPI, cc.Cache) @@ -308,20 +335,10 @@ func (v *Renault) kamereonPerson(personID string) (string, error) { return res.Accounts[0].AccountID, err } -func (v *Renault) kamereonVehicles(accountID string) ([]string, error) { - uri := fmt.Sprintf("%s/commerce/v1/accounts/%s/vehicles", v.kamereon.Target, accountID) +func (v *Renault) kamereonVehicles(configVIN string) ([]kamereonVehicle, error) { + uri := fmt.Sprintf("%s/commerce/v1/accounts/%s/vehicles", v.kamereon.Target, v.accountID) res, err := v.kamereonRequest(uri, nil) - - var vehicles []string - if err == nil { - for _, v := range res.VehicleLinks { - if strings.ToUpper(v.Status) == "ACTIVE" { - vehicles = append(vehicles, v.VIN) - } - } - } - - return vehicles, err + return res.VehicleLinks, err } // batteryAPI provides battery-status api response