Nissan: refactor (#1901)

This commit is contained in:
andig 2021-11-20 11:39:00 +01:00 • committed by GitHub
parent 1194568cf2
commit d550c7132f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 35 additions and 22 deletions

View file

@ -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)

View file

@ -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

View file

@ -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
}