Volvo: split packages

This commit is contained in:
andig 2021-11-11 20:31:01 +01:00
parent 4eafc9453f
commit b52a750237
2 changed files with 81 additions and 81 deletions

View file

@ -10,79 +10,10 @@ import (
"github.com/evcc-io/evcc/provider"
"github.com/evcc-io/evcc/util"
"github.com/evcc-io/evcc/util/request"
"github.com/evcc-io/evcc/vehicle/volvo"
)
const (
volvoAPI = "https://vocapi.wirelesscar.net/customerapi/rest/v3.0"
)
type volvoAccountResponse struct {
FirstName string `json:"firstName"`
LastName string `json:"lastName"`
VehicleRelations []string `json:"accountVehicleRelations"`
}
type volvoVehicleRelation struct {
Account string `json:"account"`
AccountID string `json:"accountId"`
Vehicle string `json:"vehicle"`
AccountVehicleRelation string `json:"accountVehicleRelation"`
VehicleID string `json:"vehicleId"`
Username string `json:"username"`
Status string `json:"status"`
CustomerVehicleRelationID int `json:"customerVehicleRelationId"`
}
type volvoStatus struct {
AverageFuelConsumption float32 `json:"averageFuelConsumption"`
AverageFuelConsumptionTimestamp string `json:"averageFuelConsumptionTimestamp"`
AverageSpeed int `json:"averageSpeed"`
AverageSpeedTimestamp string `json:"averageSpeedTimestamp"`
BrakeFluid string `json:"brakeFluid"`
BrakeFluidTimestamp string `json:"brakeFluidTimestamp"`
CarLocked bool `json:"carLocked"`
CarLockedTimestamp string `json:"carLockedTimestamp"`
ConnectionStatus string `json:"connectionStatus"` // Disconnected
ConnectionStatusTimestamp string `json:"connectionStatusTimestamp"`
DistanceToEmpty int `json:"distanceToEmpty"`
DistanceToEmptyTimestamp string `json:"distanceToEmptyTimestamp"`
EngineRunning bool `json:"engineRunning"`
EngineRunningTimestamp string `json:"engineRunningTimestamp"`
FuelAmount int `json:"fuelAmount"`
FuelAmountLevel int `json:"fuelAmountLevel"`
FuelAmountLevelTimestamp string `json:"fuelAmountLevelTimestamp"`
FuelAmountTimestamp string `json:"fuelAmountTimestamp"`
HvBattery struct {
HvBatteryChargeStatusDerived string `json:"hvBatteryChargeStatusDerived"` // CableNotPluggedInCar, CablePluggedInCar, Charging
HvBatteryChargeStatusDerivedTimestamp string `json:"hvBatteryChargeStatusDerivedTimestamp"`
HvBatteryChargeModeStatus string `json:"hvBatteryChargeModeStatus"`
HvBatteryChargeModeStatusTimestamp string `json:"hvBatteryChargeModeStatusTimestamp"`
HvBatteryChargeStatus string `json:"hvBatteryChargeStatus"` // Started, ChargeProgress, ChargeEnd, Interrupted
HvBatteryChargeStatusTimestamp string `json:"hvBatteryChargeStatusTimestamp"`
HvBatteryLevel int `json:"hvBatteryLevel"`
HvBatteryLevelTimestamp string `json:"hvBatteryLevelTimestamp"`
DistanceToHVBatteryEmpty int `json:"distanceToHVBatteryEmpty"`
DistanceToHVBatteryEmptyTimestamp string `json:"distanceToHVBatteryEmptyTimestamp"`
TimeToHVBatteryFullyCharged int `json:"timeToHVBatteryFullyCharged"`
TimeToHVBatteryFullyChargedTimestamp string `json:"timeToHVBatteryFullyChargedTimestamp"`
} `json:"hvBattery"`
Odometer float64 `json:"odometer"`
OdometerTimestamp string `json:"odometerTimestamp"`
PrivacyPolicyEnabled bool `json:"privacyPolicyEnabled"`
PrivacyPolicyEnabledTimestamp string `json:"privacyPolicyEnabledTimestamp"`
RemoteClimatizationStatus string `json:"remoteClimatizationStatus"` // CableConnectedWithoutPower
RemoteClimatizationStatusTimestamp string `json:"remoteClimatizationStatusTimestamp"`
ServiceWarningStatus string `json:"serviceWarningStatus"`
ServiceWarningStatusTimestamp string `json:"serviceWarningStatusTimestamp"`
TimeFullyAccessibleUntil string `json:"timeFullyAccessibleUntil"`
TimePartiallyAccessibleUntil string `json:"timePartiallyAccessibleUntil"`
TripMeter1 int `json:"tripMeter1"`
TripMeter1Timestamp string `json:"tripMeter1Timestamp"`
TripMeter2 int `json:"tripMeter2"`
TripMeter2Timestamp string `json:"tripMeter2Timestamp"`
}
// Volvo is an api.Vehicle implementation for Volvo cars
// Volvo is an api.Vehicle implementation for Volvo. cars
type Volvo struct {
*embed
*request.Helper
@ -148,13 +79,13 @@ func (v *Volvo) request(uri string) (*http.Request, error) {
func (v *Volvo) vehicles() ([]string, error) {
var vehicles []string
req, err := v.request(fmt.Sprintf("%s/customeraccounts", volvoAPI))
req, err := v.request(fmt.Sprintf("%s/customeraccounts", volvo.ApiURI))
if err == nil {
var res volvoAccountResponse
var res volvo.AccountResponse
err = v.DoJSON(req, &res)
for _, rel := range res.VehicleRelations {
var vehicle volvoVehicleRelation
var vehicle volvo.VehicleRelation
if req, err := v.request(rel); err == nil {
if err = v.DoJSON(req, &vehicle); err != nil {
return vehicles, err
@ -169,9 +100,9 @@ func (v *Volvo) vehicles() ([]string, error) {
}
func (v *Volvo) status() (interface{}, error) {
var res volvoStatus
var res volvo.Status
req, err := v.request(fmt.Sprintf("%s/vehicles/%s/status", volvoAPI, v.vin))
req, err := v.request(fmt.Sprintf("%s/vehicles/%s/status", volvo.ApiURI, v.vin))
if err == nil {
err = v.DoJSON(req, &res)
}
@ -182,7 +113,7 @@ func (v *Volvo) status() (interface{}, error) {
// SoC implements the api.Vehicle interface
func (v *Volvo) SoC() (float64, error) {
res, err := v.statusG()
if res, ok := res.(volvoStatus); err == nil && ok {
if res, ok := res.(volvo.Status); err == nil && ok {
return float64(res.HvBattery.HvBatteryLevel), nil
}
@ -194,7 +125,7 @@ var _ api.ChargeState = (*Volvo)(nil)
// Status implements the api.ChargeState interface
func (v *Volvo) Status() (api.ChargeStatus, error) {
res, err := v.statusG()
if res, ok := res.(volvoStatus); err == nil && ok {
if res, ok := res.(volvo.Status); err == nil && ok {
switch res.HvBattery.HvBatteryChargeStatusDerived {
case "CableNotPluggedInCar":
return api.StatusA, nil
@ -213,7 +144,7 @@ var _ api.VehicleRange = (*Volvo)(nil)
// VehicleRange implements the api.VehicleRange interface
func (v *Volvo) Range() (int64, error) {
res, err := v.statusG()
if res, ok := res.(volvoStatus); err == nil && ok {
if res, ok := res.(volvo.Status); err == nil && ok {
return int64(res.HvBattery.DistanceToHVBatteryEmpty), nil
}
@ -225,7 +156,7 @@ var _ api.VehicleOdometer = (*Volvo)(nil)
// VehicleOdometer implements the api.VehicleOdometer interface
func (v *Volvo) Odometer() (float64, error) {
res, err := v.statusG()
if res, ok := res.(volvoStatus); err == nil && ok {
if res, ok := res.(volvo.Status); err == nil && ok {
return float64(res.Odometer), nil
}
@ -237,7 +168,7 @@ var _ api.VehicleFinishTimer = (*Volvo)(nil)
// FinishTime implements the VehicleFinishTimer interface
func (v *Volvo) FinishTime() (time.Time, error) {
res, err := v.statusG()
if res, ok := res.(volvoStatus); err == nil && ok {
if res, ok := res.(volvo.Status); err == nil && ok {
timestamp, err := time.Parse("2006-01-02T15:04:05-0700", res.HvBattery.TimeToHVBatteryFullyChargedTimestamp)
if err == nil {

69
vehicle/volvo/types.go Normal file
View file

@ -0,0 +1,69 @@
package volvo
const ApiURI = "https://vocapi.wirelesscar.net/customerapi/rest/v3.0"
type AccountResponse struct {
FirstName string `json:"firstName"`
LastName string `json:"lastName"`
VehicleRelations []string `json:"accountVehicleRelations"`
}
type VehicleRelation struct {
Account string `json:"account"`
AccountID string `json:"accountId"`
Vehicle string `json:"vehicle"`
AccountVehicleRelation string `json:"accountVehicleRelation"`
VehicleID string `json:"vehicleId"`
Username string `json:"username"`
Status string `json:"status"`
CustomerVehicleRelationID int `json:"customerVehicleRelationId"`
}
type Status struct {
AverageFuelConsumption float32 `json:"averageFuelConsumption"`
AverageFuelConsumptionTimestamp string `json:"averageFuelConsumptionTimestamp"`
AverageSpeed int `json:"averageSpeed"`
AverageSpeedTimestamp string `json:"averageSpeedTimestamp"`
BrakeFluid string `json:"brakeFluid"`
BrakeFluidTimestamp string `json:"brakeFluidTimestamp"`
CarLocked bool `json:"carLocked"`
CarLockedTimestamp string `json:"carLockedTimestamp"`
ConnectionStatus string `json:"connectionStatus"` // Disconnected
ConnectionStatusTimestamp string `json:"connectionStatusTimestamp"`
DistanceToEmpty int `json:"distanceToEmpty"`
DistanceToEmptyTimestamp string `json:"distanceToEmptyTimestamp"`
EngineRunning bool `json:"engineRunning"`
EngineRunningTimestamp string `json:"engineRunningTimestamp"`
FuelAmount int `json:"fuelAmount"`
FuelAmountLevel int `json:"fuelAmountLevel"`
FuelAmountLevelTimestamp string `json:"fuelAmountLevelTimestamp"`
FuelAmountTimestamp string `json:"fuelAmountTimestamp"`
HvBattery struct {
HvBatteryChargeStatusDerived string `json:"hvBatteryChargeStatusDerived"` // CableNotPluggedInCar, CablePluggedInCar, Charging
HvBatteryChargeStatusDerivedTimestamp string `json:"hvBatteryChargeStatusDerivedTimestamp"`
HvBatteryChargeModeStatus string `json:"hvBatteryChargeModeStatus"`
HvBatteryChargeModeStatusTimestamp string `json:"hvBatteryChargeModeStatusTimestamp"`
HvBatteryChargeStatus string `json:"hvBatteryChargeStatus"` // Started, ChargeProgress, ChargeEnd, Interrupted
HvBatteryChargeStatusTimestamp string `json:"hvBatteryChargeStatusTimestamp"`
HvBatteryLevel int `json:"hvBatteryLevel"`
HvBatteryLevelTimestamp string `json:"hvBatteryLevelTimestamp"`
DistanceToHVBatteryEmpty int `json:"distanceToHVBatteryEmpty"`
DistanceToHVBatteryEmptyTimestamp string `json:"distanceToHVBatteryEmptyTimestamp"`
TimeToHVBatteryFullyCharged int `json:"timeToHVBatteryFullyCharged"`
TimeToHVBatteryFullyChargedTimestamp string `json:"timeToHVBatteryFullyChargedTimestamp"`
} `json:"hvBattery"`
Odometer float64 `json:"odometer"`
OdometerTimestamp string `json:"odometerTimestamp"`
PrivacyPolicyEnabled bool `json:"privacyPolicyEnabled"`
PrivacyPolicyEnabledTimestamp string `json:"privacyPolicyEnabledTimestamp"`
RemoteClimatizationStatus string `json:"remoteClimatizationStatus"` // CableConnectedWithoutPower
RemoteClimatizationStatusTimestamp string `json:"remoteClimatizationStatusTimestamp"`
ServiceWarningStatus string `json:"serviceWarningStatus"`
ServiceWarningStatusTimestamp string `json:"serviceWarningStatusTimestamp"`
TimeFullyAccessibleUntil string `json:"timeFullyAccessibleUntil"`
TimePartiallyAccessibleUntil string `json:"timePartiallyAccessibleUntil"`
TripMeter1 int `json:"tripMeter1"`
TripMeter1Timestamp string `json:"tripMeter1Timestamp"`
TripMeter2 int `json:"tripMeter2"`
TripMeter2Timestamp string `json:"tripMeter2Timestamp"`
}