Skip to content

Commit

Permalink
Mercedes: add odometer
Browse files Browse the repository at this point in the history
  • Loading branch information
andig committed Mar 17, 2023
1 parent 970f6d9 commit 31201a9
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 3 deletions.
19 changes: 18 additions & 1 deletion vehicle/mercedes/api.go
Expand Up @@ -68,6 +68,19 @@ func (v *API) Range(vin string) (EVResponse, error) {
return res, err
}

// Odometer implements the /odo response
func (v *API) Odometer(vin string) (EVResponse, error) {
var res EVResponse

uri := fmt.Sprintf("%s/vehicles/%s/resources/odo", v.BaseURI(), vin)
err := v.GetJSON(uri, &res)
if err != nil {
res, err = v.allinOne(vin)
}

return res, err
}

// allinOne is a 'fallback' to gather both metrics range and soc.
// It is used in case for any reason the single endpoints return an error - which happend in the past.
func (v *API) allinOne(vin string) (EVResponse, error) {
Expand All @@ -76,7 +89,7 @@ func (v *API) allinOne(vin string) (EVResponse, error) {
uri := fmt.Sprintf("%s/vehicles/%s/containers/electricvehicle", v.BaseURI(), vin)
err := v.GetJSON(uri, &res)

evres := EVResponse{}
var evres EVResponse

for _, r := range res {
if r.Soc.Timestamp != 0 {
Expand All @@ -87,6 +100,10 @@ func (v *API) allinOne(vin string) (EVResponse, error) {
if r.RangeElectric.Timestamp != 0 {
evres.RangeElectric = r.RangeElectric
}

if r.Odometer.Timestamp != 0 {
evres.Odometer = r.Odometer
}
}

return evres, err
Expand Down
3 changes: 2 additions & 1 deletion vehicle/mercedes/identity.go
Expand Up @@ -50,7 +50,8 @@ func NewIdentity(log *util.Logger, id, secret string, options ...IdentityOption)
Scopes: []string{
oidc.ScopeOpenID,
oidc.ScopeOfflineAccess,
"mb:vehicle:mbdata:evstatus",
"mb:vehicle:mbdata:evstatus", // soc, range
"mb:vehicle:mbdata:payasyoudrive", // odo
},
}

Expand Down
16 changes: 15 additions & 1 deletion vehicle/mercedes/provider.go
Expand Up @@ -10,6 +10,7 @@ import (
type Provider struct {
chargerG func() (EVResponse, error)
rangeG func() (EVResponse, error)
odoG func() (EVResponse, error)
}

// NewProvider creates a vehicle api provider
Expand All @@ -21,6 +22,9 @@ func NewProvider(api *API, vin string, cache time.Duration) *Provider {
rangeG: provider.Cached(func() (EVResponse, error) {
return api.Range(vin)
}, cache),
odoG: provider.Cached(func() (EVResponse, error) {
return api.Odometer(vin)
}, cache),
}
return impl
}
Expand All @@ -36,11 +40,21 @@ func (v *Provider) Soc() (float64, error) {
}

// Range implements the api.VehicleRange interface
func (v *Provider) Range() (rng int64, err error) {
func (v *Provider) Range() (int64, error) {
res, err := v.rangeG()
if err == nil {
return int64(res.RangeElectric.Value), nil
}

return 0, err
}

// Odometer implements the api.VehicleOdometer interface
func (v *Provider) Odometer() (int64, error) {
res, err := v.odoG()
if err == nil {
return int64(res.Odometer.Value), nil
}

return 0, err
}
4 changes: 4 additions & 0 deletions vehicle/mercedes/types.go
Expand Up @@ -9,4 +9,8 @@ type EVResponse struct {
Value int64 `json:",string"`
Timestamp int64
}
Odometer struct {
Value int64 `json:",string"`
Timestamp int64
} `json:"odo"`
}

0 comments on commit 31201a9

Please sign in to comment.