From 3363c34722c99be51e0dbf34376cc9a84afcd898 Mon Sep 17 00:00:00 2001 From: andig Date: Sat, 20 Nov 2021 13:41:33 +0100 Subject: [PATCH] Volvo: refactor (#1902) --- vehicle/id/types.go | 4 +- vehicle/volvo.go | 12 ++--- vehicle/volvo/types.go | 116 +++++++++++++++++++++++++---------------- 3 files changed, 78 insertions(+), 54 deletions(-) diff --git a/vehicle/id/types.go b/vehicle/id/types.go index 2f81ba4c3..5c83f7b9b 100644 --- a/vehicle/id/types.go +++ b/vehicle/id/types.go @@ -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), "\"") diff --git a/vehicle/volvo.go b/vehicle/volvo.go index 677a075fd..6076f52fb 100644 --- a/vehicle/volvo.go +++ b/vehicle/volvo.go @@ -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 diff --git a/vehicle/volvo/types.go b/vehicle/volvo/types.go index 28813c4c6..f48f97d2f 100644 --- a/vehicle/volvo/types.go +++ b/vehicle/volvo/types.go @@ -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 }