Volvo: refactor (#1902)

This commit is contained in:
andig 2021-11-20 13:41:33 +01:00 • committed by GitHub
parent d550c7132f
commit 3363c34722
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 78 additions and 54 deletions

View file

@ -101,12 +101,12 @@ type MaintenanceStatus struct {
OilServiceDueKm int `json:"oilServiceDue_km"`
}
// Timestamp implements JSON unmarshal for RFC3339 string timestamp
// Timestamp implements JSON unmarshal
type Timestamp struct {
time.Time
}
// UnmarshalJSON decodes RFC3339 string timestamp into time.Time
// UnmarshalJSON decodes string timestamp into time.Time
func (ct *Timestamp) UnmarshalJSON(data []byte) error {
s := strings.Trim(string(data), "\"")

View file

@ -151,7 +151,7 @@ var _ api.VehicleOdometer = (*Volvo)(nil)
func (v *Volvo) Odometer() (float64, error) {
res, err := v.statusG()
if res, ok := res.(volvo.Status); err == nil && ok {
return res.Odometer, nil
return res.Odometer / 1e3, nil
}
return 0, err
@ -163,13 +163,9 @@ var _ api.VehicleFinishTimer = (*Volvo)(nil)
func (v *Volvo) FinishTime() (time.Time, error) {
res, err := v.statusG()
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 {
timestamp = timestamp.Add(time.Duration(res.HvBattery.DistanceToHVBatteryEmpty) * time.Minute)
if timestamp.Before(time.Now()) {
return time.Time{}, api.ErrNotAvailable
}
timestamp := res.HvBattery.TimeToHVBatteryFullyChargedTimestamp.Add(time.Duration(res.HvBattery.DistanceToHVBatteryEmpty) * time.Minute)
if timestamp.Before(time.Now()) {
return time.Time{}, api.ErrNotAvailable
}
return timestamp, err

View file

@ -1,5 +1,10 @@
package volvo
import (
"strings"
"time"
)
const ApiURI = "https://vocapi.wirelesscar.net/customerapi/rest/v3.0"
type AccountResponse struct {
@ -20,50 +25,73 @@ type VehicleRelation struct {
}
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"`
AverageFuelConsumption float32 `json:"averageFuelConsumption"`
AverageFuelConsumptionTimestamp Timestamp `json:"averageFuelConsumptionTimestamp"`
AverageSpeed int `json:"averageSpeed"`
AverageSpeedTimestamp Timestamp `json:"averageSpeedTimestamp"`
BrakeFluid string `json:"brakeFluid"`
BrakeFluidTimestamp Timestamp `json:"brakeFluidTimestamp"`
CarLocked bool `json:"carLocked"`
CarLockedTimestamp Timestamp `json:"carLockedTimestamp"`
ConnectionStatus string `json:"connectionStatus"` // Disconnected
ConnectionStatusTimestamp Timestamp `json:"connectionStatusTimestamp"`
DistanceToEmpty int `json:"distanceToEmpty"`
DistanceToEmptyTimestamp Timestamp `json:"distanceToEmptyTimestamp"`
EngineRunning bool `json:"engineRunning"`
EngineRunningTimestamp Timestamp `json:"engineRunningTimestamp"`
FuelAmount int `json:"fuelAmount"`
FuelAmountLevel int `json:"fuelAmountLevel"`
FuelAmountLevelTimestamp Timestamp `json:"fuelAmountLevelTimestamp"`
FuelAmountTimestamp Timestamp `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"`
HvBatteryChargeStatusDerived string `json:"hvBatteryChargeStatusDerived"` // CableNotPluggedInCar, CablePluggedInCar, Charging
HvBatteryChargeStatusDerivedTimestamp Timestamp `json:"hvBatteryChargeStatusDerivedTimestamp"`
HvBatteryChargeModeStatus string `json:"hvBatteryChargeModeStatus"`
HvBatteryChargeModeStatusTimestamp Timestamp `json:"hvBatteryChargeModeStatusTimestamp"`
HvBatteryChargeStatus string `json:"hvBatteryChargeStatus"` // Started, ChargeProgress, ChargeEnd, Interrupted
HvBatteryChargeStatusTimestamp Timestamp `json:"hvBatteryChargeStatusTimestamp"`
HvBatteryLevel int `json:"hvBatteryLevel"`
HvBatteryLevelTimestamp Timestamp `json:"hvBatteryLevelTimestamp"`
DistanceToHVBatteryEmpty int `json:"distanceToHVBatteryEmpty"`
DistanceToHVBatteryEmptyTimestamp Timestamp `json:"distanceToHVBatteryEmptyTimestamp"`
TimeToHVBatteryFullyCharged int `json:"timeToHVBatteryFullyCharged"`
TimeToHVBatteryFullyChargedTimestamp Timestamp `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"`
Odometer float64 `json:"odometer"`
OdometerTimestamp Timestamp `json:"odometerTimestamp"`
PrivacyPolicyEnabled bool `json:"privacyPolicyEnabled"`
PrivacyPolicyEnabledTimestamp Timestamp `json:"privacyPolicyEnabledTimestamp"`
RemoteClimatizationStatus string `json:"remoteClimatizationStatus"` // CableConnectedWithoutPower
RemoteClimatizationStatusTimestamp Timestamp `json:"remoteClimatizationStatusTimestamp"`
ServiceWarningStatus string `json:"serviceWarningStatus"`
ServiceWarningStatusTimestamp Timestamp `json:"serviceWarningStatusTimestamp"`
TimeFullyAccessibleUntil string `json:"timeFullyAccessibleUntil"`
TimePartiallyAccessibleUntil string `json:"timePartiallyAccessibleUntil"`
TripMeter1 int `json:"tripMeter1"`
TripMeter1Timestamp Timestamp `json:"tripMeter1Timestamp"`
TripMeter2 int `json:"tripMeter2"`
TripMeter2Timestamp Timestamp `json:"tripMeter2Timestamp"`
}
const timeFormat = "2006-01-02T15:04:05-0700"
// Timestamp implements JSON unmarshal
type Timestamp struct {
time.Time
}
// UnmarshalJSON decodes string timestamp into time.Time
func (ct *Timestamp) UnmarshalJSON(data []byte) error {
s := strings.Trim(string(data), "\"")
if s == "null" {
return nil
}
t, err := time.Parse(timeFormat, s)
if err == nil {
(*ct).Time = t
}
return err
}