From 0c0e1f57b43ce0c770f9e84fbe1431097ec8fce9 Mon Sep 17 00:00:00 2001 From: Elina Urbanovich <83229929+ElinaUrbanovich@users.noreply.github.com> Date: Tue, 22 Aug 2023 22:36:24 +0300 Subject: [PATCH] Renault: add position and start/stop charge (#9499) Co-authored-by: Elina Urbanovich --- vehicle/renault/kamereon/api.go | 25 +++++++++++++++++++++++ vehicle/renault/kamereon/types.go | 3 +++ vehicle/renault/provider.go | 34 +++++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+) diff --git a/vehicle/renault/kamereon/api.go b/vehicle/renault/kamereon/api.go index 8c64d2dcdd..7411ec56ee 100644 --- a/vehicle/renault/kamereon/api.go +++ b/vehicle/renault/kamereon/api.go @@ -14,6 +14,11 @@ import ( "github.com/evcc-io/evcc/vehicle/renault/keys" ) +const ( + ActionStart = "start" + ActionStop = "stop" +) + type API struct { *request.Helper keys keys.ConfigServer @@ -118,3 +123,23 @@ func (v *API) WakeUp(accountID string, vin string) (Response, error) { return v.request(uri, request.MarshalJSON(data)) } + +func (v *API) Position(accountID string, vin string) (Response, error) { + uri := fmt.Sprintf("%s/commerce/v1/accounts/%s/kamereon/kca/car-adapter/v1/cars/%s/location", v.keys.Target, accountID, vin) + return v.request(uri, nil) +} + +func (v *API) Action(accountID, action string, vin string) (Response, error) { + uri := fmt.Sprintf("%s/commerce/v1/accounts/%s/kamereon/kca/car-adapter/v1/cars/%s/actions/charging-start", v.keys.Target, accountID, vin) + + data := map[string]interface{}{ + "data": map[string]interface{}{ + "type": "ChargingStart", + "attributes": map[string]interface{}{ + "action": action, + }, + }, + } + + return v.request(uri, request.MarshalJSON(data)) +} diff --git a/vehicle/renault/kamereon/types.go b/vehicle/renault/kamereon/types.go index d612d9ae78..a529695fdd 100644 --- a/vehicle/renault/kamereon/types.go +++ b/vehicle/renault/kamereon/types.go @@ -65,4 +65,7 @@ type attributes struct { HvacStatus string `json:"hvacStatus"` // cockpit TotalMileage float64 `json:"totalMileage"` + // position + Latitude float64 `json:"gpsLatitude"` + Longitude float64 `json:"gpsLongitude"` } diff --git a/vehicle/renault/provider.go b/vehicle/renault/provider.go index 2775594cc1..89706a4eee 100644 --- a/vehicle/renault/provider.go +++ b/vehicle/renault/provider.go @@ -18,6 +18,8 @@ type Provider struct { cockpitG func() (kamereon.Response, error) hvacG func() (kamereon.Response, error) wakeup func() (kamereon.Response, error) + position func() (kamereon.Response, error) + action func(action string) (kamereon.Response, error) } // NewProvider creates a vehicle api provider @@ -35,6 +37,12 @@ func NewProvider(api *kamereon.API, accountID, vin string, cache time.Duration) wakeup: func() (kamereon.Response, error) { return api.WakeUp(accountID, vin) }, + position: func() (kamereon.Response, error) { + return api.Position(accountID, vin) + }, + action: func(action string) (kamereon.Response, error) { + return api.Action(accountID, action, vin) + }, } return impl } @@ -147,3 +155,29 @@ func (v *Provider) WakeUp() error { _, err := v.wakeup() return err } + +var _ api.VehiclePosition = (*Provider)(nil) + +// Position implements the api.VehiclePosition interface +func (v *Provider) Position() (float64, float64, error) { + res, err := v.position() + if err == nil { + return res.Data.Attributes.Latitude, res.Data.Attributes.Longitude, nil + } + + return 0, 0, err +} + +var _ api.VehicleChargeController = (*Provider)(nil) + +// StartCharge implements the api.VehicleChargeController interface +func (v *Provider) StartCharge() error { + _, err := v.action(kamereon.ActionStart) + return err +} + +// StopCharge implements the api.VehicleChargeController interface +func (v *Provider) StopCharge() error { + _, err := v.action(kamereon.ActionStart) + return err +}