From d550c7132f4ff6a90bc4b3aecd8448d07cc0a1a2 Mon Sep 17 00:00:00 2001 From: andig Date: Sat, 20 Nov 2021 11:39:00 +0100 Subject: [PATCH] Nissan: refactor (#1901) --- vehicle/nissan/api.go | 2 -- vehicle/nissan/provider.go | 11 +++------- vehicle/nissan/types.go | 44 +++++++++++++++++++++++++++----------- 3 files changed, 35 insertions(+), 22 deletions(-) diff --git a/vehicle/nissan/api.go b/vehicle/nissan/api.go index 014344839..d96864d58 100644 --- a/vehicle/nissan/api.go +++ b/vehicle/nissan/api.go @@ -56,8 +56,6 @@ func (v *API) Vehicles() ([]string, error) { return vehicles, err } -const timeFormat = "2006-01-02T15:04:05Z" - // Battery provides battery api response func (v *API) BatteryStatus(vin string) (Response, error) { uri := fmt.Sprintf("%s/v1/cars/%s/battery-status", CarAdapterBaseURL, vin) diff --git a/vehicle/nissan/provider.go b/vehicle/nissan/provider.go index 9f8677971..189722df4 100644 --- a/vehicle/nissan/provider.go +++ b/vehicle/nissan/provider.go @@ -39,12 +39,9 @@ func NewProvider(api *API, vin string, expiry, cache time.Duration) *Provider { func (v *Provider) status(battery func() (Response, error), refresh func() (Response, error)) (Response, error) { res, err := battery() - var ts time.Time if err == nil { - ts, err = time.Parse(timeFormat, res.Data.Attributes.LastUpdateTime) - - // return the current value - if time.Since(ts) <= v.expiry { + // result valid? + if res.Data.Attributes.LastUpdateTime.Add(v.expiry).After(time.Now()) { v.refreshTime = time.Time{} return res, err } @@ -132,13 +129,11 @@ func (v *Provider) FinishTime() (time.Time, error) { res, err := v.statusG() if res, ok := res.(Response); err == nil && ok { - timestamp, err := time.Parse(time.RFC3339, res.Data.Attributes.Timestamp) - if res.Data.Attributes.RemainingTime == nil { return time.Time{}, api.ErrNotAvailable } - return timestamp.Add(time.Duration(*res.Data.Attributes.RemainingTime) * time.Minute), err + return res.Data.Attributes.Timestamp.Add(time.Duration(*res.Data.Attributes.RemainingTime) * time.Minute), err } return time.Time{}, err diff --git a/vehicle/nissan/types.go b/vehicle/nissan/types.go index 837f44021..af65b3dbd 100644 --- a/vehicle/nissan/types.go +++ b/vehicle/nissan/types.go @@ -3,6 +3,7 @@ package nissan import ( "fmt" "strings" + "time" ) // api constants @@ -92,16 +93,35 @@ type Error struct { } type attributes struct { - Timestamp string `json:"timestamp"` - ChargingStatus float32 `json:"chargingStatus"` - InstantaneousPower int `json:"instantaneousPower"` - RangeHvacOff int `json:"rangeHvacOff"` // Nissan - BatteryAutonomy int `json:"batteryAutonomy"` // Renault - BatteryLevel int `json:"batteryLevel"` - BatteryCapacity int `json:"batteryCapacity"` // Nissan - BatteryTemperature int `json:"batteryTemperature"` - PlugStatus int `json:"plugStatus"` - LastUpdateTime string `json:"lastUpdateTime"` - ChargePower int `json:"chargePower"` - RemainingTime *int `json:"chargingRemainingTime"` + Timestamp Timestamp `json:"timestamp"` + ChargingStatus float32 `json:"chargingStatus"` + InstantaneousPower int `json:"instantaneousPower"` + RangeHvacOff int `json:"rangeHvacOff"` // Nissan + BatteryAutonomy int `json:"batteryAutonomy"` // Renault + BatteryLevel int `json:"batteryLevel"` + BatteryCapacity int `json:"batteryCapacity"` // Nissan + BatteryTemperature int `json:"batteryTemperature"` + PlugStatus int `json:"plugStatus"` + LastUpdateTime Timestamp `json:"lastUpdateTime"` + ChargePower int `json:"chargePower"` + RemainingTime *int `json:"chargingRemainingTime"` +} + +const timeFormat = "2006-01-02T15:04:05Z" + +// 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), "\"") + + t, err := time.Parse(timeFormat, s) + if err == nil { + (*ct).Time = t + } + + return err }