diff --git a/vehicle/bluelink/provider.go b/vehicle/bluelink/provider.go index 4b5ddb18d0..779b8d1527 100644 --- a/vehicle/bluelink/provider.go +++ b/vehicle/bluelink/provider.go @@ -96,22 +96,33 @@ var _ api.Battery = (*Provider)(nil) // Soc implements the api.Battery interface func (v *Provider) Soc() (float64, error) { res, err := v.statusG() + if err != nil { + return 0, err + } - if err == nil { + if res.EvStatus != nil { return res.EvStatus.BatteryStatus, nil } - return 0, err + if res.Battery != nil { + return float64(res.Battery.BatSoc), nil + } + + return 0, api.ErrNotAvailable } var _ api.ChargeState = (*Provider)(nil) // Status implements the api.Battery interface func (v *Provider) Status() (api.ChargeStatus, error) { + status := api.StatusNone + res, err := v.statusG() + if err != nil { + return status, err + } - status := api.StatusNone - if err == nil { + if res.EvStatus != nil { status = api.StatusA if res.EvStatus.BatteryPlugin > 0 || res.EvStatus.ChargePortDoorOpenStatus == 1 { status = api.StatusB @@ -121,7 +132,7 @@ func (v *Provider) Status() (api.ChargeStatus, error) { } } - return status, err + return status, api.ErrNotAvailable } var _ api.VehicleFinishTimer = (*Provider)(nil) @@ -129,8 +140,11 @@ var _ api.VehicleFinishTimer = (*Provider)(nil) // FinishTime implements the api.VehicleFinishTimer interface func (v *Provider) FinishTime() (time.Time, error) { res, err := v.statusG() + if err != nil { + return time.Time{}, err + } - if err == nil { + if res.EvStatus != nil { remaining := res.EvStatus.RemainTime2.Atc.Value if remaining == 0 { @@ -141,7 +155,7 @@ func (v *Provider) FinishTime() (time.Time, error) { return ts.Add(time.Duration(remaining) * time.Minute), err } - return time.Time{}, err + return time.Time{}, api.ErrNotAvailable } var _ api.VehicleRange = (*Provider)(nil) @@ -149,16 +163,17 @@ var _ api.VehicleRange = (*Provider)(nil) // Range implements the api.VehicleRange interface func (v *Provider) Range() (int64, error) { res, err := v.statusG() + if err != nil { + return 0, err + } - if err == nil { + if res.EvStatus != nil { if dist := res.EvStatus.DrvDistance; len(dist) == 1 { return int64(dist[0].RangeByFuel.EvModeRange.Value), nil } - - return 0, api.ErrNotAvailable } - return 0, err + return 0, api.ErrNotAvailable } var _ api.VehicleOdometer = (*Provider)(nil) @@ -166,7 +181,15 @@ var _ api.VehicleOdometer = (*Provider)(nil) // Range implements the api.VehicleRange interface func (v *Provider) Odometer() (float64, error) { res, err := v.statusLG() - return res.ResMsg.VehicleStatusInfo.Odometer.Value, err + if err != nil { + return 0, err + } + + if res.ResMsg.VehicleStatusInfo.Odometer != nil { + return res.ResMsg.VehicleStatusInfo.Odometer.Value, err + } + + return 0, api.ErrNotAvailable } var _ api.SocLimiter = (*Provider)(nil) @@ -174,8 +197,11 @@ var _ api.SocLimiter = (*Provider)(nil) // GetLimitSoc implements the api.SocLimiter interface func (v *Provider) GetLimitSoc() (int64, error) { res, err := v.statusG() + if err != nil { + return 0, err + } - if err == nil { + if res.EvStatus != nil { for _, targetSOC := range res.EvStatus.ReservChargeInfos.TargetSocList { if targetSOC.PlugType == plugTypeAC { return int64(targetSOC.TargetSocLevel), nil @@ -183,7 +209,7 @@ func (v *Provider) GetLimitSoc() (int64, error) { } } - return 0, err + return 0, api.ErrNotAvailable } var _ api.VehiclePosition = (*Provider)(nil) @@ -191,8 +217,16 @@ var _ api.VehiclePosition = (*Provider)(nil) // Position implements the api.VehiclePosition interface func (v *Provider) Position() (float64, float64, error) { res, err := v.statusLG() - coord := res.ResMsg.VehicleStatusInfo.VehicleLocation.Coord - return coord.Lat, coord.Lon, err + if err != nil { + return 0, 0, err + } + + if res.ResMsg.VehicleStatusInfo.VehicleLocation != nil { + coord := res.ResMsg.VehicleStatusInfo.VehicleLocation.Coord + return coord.Lat, coord.Lon, err + } + + return 0, 0, api.ErrNotAvailable } var _ api.Resurrector = (*Provider)(nil) diff --git a/vehicle/bluelink/types.go b/vehicle/bluelink/types.go index d365207848..ffe665ba59 100644 --- a/vehicle/bluelink/types.go +++ b/vehicle/bluelink/types.go @@ -21,15 +21,15 @@ type StatusLatestResponse struct { ResMsg struct { VehicleStatusInfo struct { VehicleStatus VehicleStatus - VehicleLocation VehicleLocation - Odometer Odometer + VehicleLocation *VehicleLocation + Odometer *Odometer } } } type VehicleStatus struct { Time string - EvStatus struct { + EvStatus *struct { BatteryCharge bool BatteryStatus float64 BatteryPlugin int @@ -42,6 +42,9 @@ type VehicleStatus struct { DrvDistance []DrivingDistance ReservChargeInfos ReservChargeInfo } + Battery *struct { + BatSoc int + } Vehicles []Vehicle }