84 lines
2 KiB
Go
84 lines
2 KiB
Go
package porsche
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"github.com/evcc-io/evcc/util"
|
|
"github.com/evcc-io/evcc/util/request"
|
|
"github.com/evcc-io/evcc/util/transport"
|
|
"golang.org/x/oauth2"
|
|
)
|
|
|
|
const (
|
|
ApiURI = "https://api.porsche.com"
|
|
|
|
PairingComplete = "PAIRINGCOMPLETE"
|
|
PairingInProcess = "INPROCESS"
|
|
)
|
|
|
|
func IsPaired(status string) bool {
|
|
return status == PairingComplete || status == PairingInProcess
|
|
}
|
|
|
|
// API is an api.Vehicle implementation for Porsche PHEV cars
|
|
type API struct {
|
|
*request.Helper
|
|
}
|
|
|
|
// NewAPI creates a new vehicle
|
|
func NewAPI(log *util.Logger, identity oauth2.TokenSource) *API {
|
|
v := &API{
|
|
Helper: request.NewHelper(log),
|
|
}
|
|
|
|
v.Client.Transport = &transport.Decorator{
|
|
Base: &oauth2.Transport{
|
|
Source: identity,
|
|
Base: v.Client.Transport,
|
|
},
|
|
Decorator: transport.DecorateHeaders(map[string]string{
|
|
"apikey": OAuth2Config.ClientID,
|
|
}),
|
|
}
|
|
|
|
return v
|
|
}
|
|
|
|
// Vehicles implements the vehicle list response
|
|
func (v *API) Vehicles() ([]Vehicle, error) {
|
|
var res []Vehicle
|
|
uri := fmt.Sprintf("%s/core/api/v3/de/de_DE/vehicles", ApiURI)
|
|
err := v.GetJSON(uri, &res)
|
|
return res, err
|
|
}
|
|
|
|
// PairingStatus implements the vehicle pairing status response
|
|
func (v *API) PairingStatus(vin string) (VehiclePairingResponse, error) {
|
|
var res VehiclePairingResponse
|
|
uri := fmt.Sprintf("%s/core/api/v3/de/de_DE/vehicles/%s/pairing", ApiURI, vin)
|
|
err := v.GetJSON(uri, &res)
|
|
return res, err
|
|
}
|
|
|
|
// Status implements the vehicle status response
|
|
func (v *API) Status(vin string) (StatusResponse, error) {
|
|
var res StatusResponse
|
|
uri := fmt.Sprintf("%s/vehicle-data/de/de_DE/status/%s", ApiURI, vin)
|
|
err := v.GetJSON(uri, &res)
|
|
return res, err
|
|
}
|
|
|
|
// WakeUp tries to wakeup the vehicle by requesting the current vehicle overview
|
|
func (v *API) WakeUp(vin string) error {
|
|
uri := fmt.Sprintf("%s/service-vehicle/de/de_DE/vehicle-data/%s/current/request", ApiURI, vin)
|
|
req, err := request.New(http.MethodPost, uri, nil, request.AcceptJSON)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
resp, err := v.Do(req)
|
|
if err == nil {
|
|
resp.Body.Close()
|
|
}
|
|
return err
|
|
}
|