diff --git a/vehicle/hyundai.go b/vehicle/bluelink.go similarity index 58% rename from vehicle/hyundai.go rename to vehicle/bluelink.go index 2857a4559..e87984a9a 100644 --- a/vehicle/hyundai.go +++ b/vehicle/bluelink.go @@ -10,33 +10,19 @@ import ( "github.com/evcc-io/evcc/vehicle/bluelink" ) -// Hyundai is an api.Vehicle implementation -type Hyundai struct { +// Bluelink is an api.Vehicle implementation +type Bluelink struct { *embed *bluelink.Provider } func init() { + registry.Add("kia", NewKiaFromConfig) registry.Add("hyundai", NewHyundaiFromConfig) } -// NewHyundaiFromConfig creates a new Vehicle +// NewHyundaiFromConfig creates a new vehicle func NewHyundaiFromConfig(other map[string]interface{}) (api.Vehicle, error) { - cc := struct { - embed `mapstructure:",squash"` - User, Password string - VIN string - Expiry time.Duration - Cache time.Duration - }{ - Expiry: expiry, - Cache: interval, - } - - if err := util.DecodeOther(other, &cc); err != nil { - return nil, err - } - settings := bluelink.Config{ URI: "https://prd.eu-ccapi.hyundai.com:8080", BasicToken: "NmQ0NzdjMzgtM2NhNC00Y2YzLTk1NTctMmExOTI5YTk0NjU0OktVeTQ5WHhQekxwTHVvSzB4aEJDNzdXNlZYaG10UVI5aVFobUlGampvWTRJcHhzVg==", @@ -46,10 +32,46 @@ func NewHyundaiFromConfig(other map[string]interface{}) (api.Vehicle, error) { BrandAuthUrl: "https://eu-account.hyundai.com/auth/realms/euhyundaiidm/protocol/openid-connect/auth?client_id=%s&scope=openid%%20profile%%20email%%20phone&response_type=code&hkid_session_reset=true&redirect_uri=%s/api/v1/user/integration/redirect/login&ui_locales=%s&state=%s:%s", } - log := util.NewLogger("hyundai").Redact(cc.User, cc.Password, cc.VIN) + return newBluelinkFromConfig("hyundai", other, settings) +} + +// NewKiaFromConfig creates a new vehicle +func NewKiaFromConfig(other map[string]interface{}) (api.Vehicle, error) { + settings := bluelink.Config{ + URI: "https://prd.eu-ccapi.kia.com:8080", + BasicToken: "ZmRjODVjMDAtMGEyZi00YzY0LWJjYjQtMmNmYjE1MDA3MzBhOnNlY3JldA==", + CCSPServiceID: "fdc85c00-0a2f-4c64-bcb4-2cfb1500730a", + CCSPApplicationID: bluelink.KiaAppID, + AuthClientID: "572e0304-5f8d-4b4c-9dd5-41aa84eed160", + BrandAuthUrl: "https://eu-account.kia.com/auth/realms/eukiaidm/protocol/openid-connect/auth?client_id=%s&scope=openid%%20profile%%20email%%20phone&response_type=code&hkid_session_reset=true&redirect_uri=%s/api/v1/user/integration/redirect/login&ui_locales=%s&state=%s:%s", + } + + return newBluelinkFromConfig("kia", other, settings) +} + +// newBluelinkFromConfig creates a new Vehicle +func newBluelinkFromConfig(brand string, other map[string]interface{}, settings bluelink.Config) (api.Vehicle, error) { + cc := struct { + embed `mapstructure:",squash"` + User, Password string + VIN string + Language string + Expiry time.Duration + Cache time.Duration + }{ + Language: "en", + Expiry: expiry, + Cache: interval, + } + + if err := util.DecodeOther(other, &cc); err != nil { + return nil, err + } + + log := util.NewLogger(brand).Redact(cc.User, cc.Password, cc.VIN) identity := bluelink.NewIdentity(log, settings) - if err := identity.Login(cc.User, cc.Password); err != nil { + if err := identity.Login(cc.User, cc.Password, cc.Language); err != nil { return nil, err } @@ -68,7 +90,6 @@ func NewHyundaiFromConfig(other map[string]interface{}) (api.Vehicle, error) { for _, v := range vehicles { if v.VIN == strings.ToUpper(cc.VIN) { vehicle = v - log.DEBUG.Printf("found vehicle: %v", vehicle.VIN) } } } @@ -77,7 +98,7 @@ func NewHyundaiFromConfig(other map[string]interface{}) (api.Vehicle, error) { return nil, fmt.Errorf("cannot find vehicle: %v", vehicles) } - v := &Hyundai{ + v := &Bluelink{ embed: &cc.embed, Provider: bluelink.NewProvider(api, vehicle.VehicleID, cc.Expiry, cc.Cache), } diff --git a/vehicle/bluelink/identity.go b/vehicle/bluelink/identity.go index 9d8c85d94..cee730879 100644 --- a/vehicle/bluelink/identity.go +++ b/vehicle/bluelink/identity.go @@ -120,9 +120,9 @@ func (v *Identity) getCookies() (cookieClient *request.Helper, err error) { return cookieClient, err } -func (v *Identity) setLanguage(cookieClient *request.Helper) error { +func (v *Identity) setLanguage(cookieClient *request.Helper, language string) error { data := map[string]interface{}{ - "lang": "en", + "lang": language, } req, err := request.New(http.MethodPost, v.config.URI+LanguageURL, request.MarshalJSON(data), request.JSONEncoding) @@ -322,7 +322,7 @@ func (v *Identity) RefreshToken(token *oauth2.Token) (*oauth2.Token, error) { return (*oauth2.Token)(&res), err } -func (v *Identity) Login(user, password string) (err error) { +func (v *Identity) Login(user, password, language string) (err error) { if user == "" || password == "" { return api.ErrMissingCredentials } @@ -335,7 +335,7 @@ func (v *Identity) Login(user, password string) (err error) { } if err == nil { - err = v.setLanguage(cookieClient) + err = v.setLanguage(cookieClient, language) } var code string diff --git a/vehicle/kia.go b/vehicle/kia.go deleted file mode 100644 index a50f2bb3d..000000000 --- a/vehicle/kia.go +++ /dev/null @@ -1,85 +0,0 @@ -package vehicle - -import ( - "fmt" - "strings" - "time" - - "github.com/evcc-io/evcc/api" - "github.com/evcc-io/evcc/util" - "github.com/evcc-io/evcc/vehicle/bluelink" -) - -// Kia is an api.Vehicle implementation -type Kia struct { - *embed - *bluelink.Provider // provides the api implementations -} - -func init() { - registry.Add("kia", NewKiaFromConfig) -} - -// NewKiaFromConfig creates a new Vehicle -func NewKiaFromConfig(other map[string]interface{}) (api.Vehicle, error) { - cc := struct { - embed `mapstructure:",squash"` - User, Password string - VIN string - Expiry time.Duration - Cache time.Duration - }{ - Expiry: expiry, - Cache: interval, - } - - if err := util.DecodeOther(other, &cc); err != nil { - return nil, err - } - - settings := bluelink.Config{ - URI: "https://prd.eu-ccapi.kia.com:8080", - BasicToken: "ZmRjODVjMDAtMGEyZi00YzY0LWJjYjQtMmNmYjE1MDA3MzBhOnNlY3JldA==", - CCSPServiceID: "fdc85c00-0a2f-4c64-bcb4-2cfb1500730a", - CCSPApplicationID: bluelink.KiaAppID, - AuthClientID: "572e0304-5f8d-4b4c-9dd5-41aa84eed160", - BrandAuthUrl: "https://eu-account.kia.com/auth/realms/eukiaidm/protocol/openid-connect/auth?client_id=%s&scope=openid%%20profile%%20email%%20phone&response_type=code&hkid_session_reset=true&redirect_uri=%s/api/v1/user/integration/redirect/login&ui_locales=%s&state=%s:%s", - } - - log := util.NewLogger("kia").Redact(cc.User, cc.Password, cc.VIN) - identity := bluelink.NewIdentity(log, settings) - - if err := identity.Login(cc.User, cc.Password); err != nil { - return nil, err - } - - api := bluelink.NewAPI(log, settings.URI, identity, cc.Cache) - - vehicles, err := api.Vehicles() - if err != nil { - return nil, err - } - - var vehicle bluelink.Vehicle - if cc.VIN == "" && len(vehicles) == 1 { - vehicle = vehicles[0] - log.DEBUG.Printf("found vehicle: %v", cc.VIN) - } else { - for _, v := range vehicles { - if v.VIN == strings.ToUpper(cc.VIN) { - vehicle = v - } - } - } - - if len(vehicle.VIN) == 0 { - return nil, fmt.Errorf("cannot find vehicle: %v", vehicles) - } - - v := &Kia{ - embed: &cc.embed, - Provider: bluelink.NewProvider(api, vehicle.VehicleID, cc.Expiry, cc.Cache), - } - - return v, nil -}