/mercedes

Mercedes-Benz Connected Vehicle API Ruby client

Primary LanguageRubyMIT LicenseMIT

mercedes

Build Status

Mercedes-Benz logo

This gem is a Ruby client for interacting with Mercedes-Benz Connected Vehicle API. This API allows to access to relevant information about Mercedes-Benz vehicles and also modify its state such as locking/unlocking doors.

Notice that this API is still experimental. You can find out more information at: https://developer.mercedes-benz.com/apis/connected_vehicle_experimental_api/

Installation

Add this line to your application's Gemfile:

gem 'mercedes'

or install it yourself as:

$ gem install mercedes

Usage

Initializing a client

The client can be configured globally:

Mercedes.configure do |config|
  config.token = '7dca6d45-0415-4732-a93d-d3514e2c8605'
end

Mercedes::Client.new

or by instance:

Mercedes::Client.new(token: '7dca6d45-0415-4732-a93d-d3514e2c8605')

Client methods

Clients methods returns a Mercedes::Response object. This kind of objects contain methods to get the status of the request (ie: #ok?, #created?, ...) and a method called #json which returns a JSON representation of the response.

Vehicle

#vehicles

It lists the available vehicles associated to the account, including their id (useful for retrieving other information), license plate number and VIN number

client.vehicles.json

Response

[
  {
    'id' => 'AA178E8213TBC9CABA',
    'licenseplate' => '8594FNC',
    'finorvin' => '1HM5F7F9XHD7C0861'
  }
]
#vehicle(vehicle_id)

It returns relevant information about a specific vehicle

client.vehicle("AA178E8213TBC9CABA").json

Response

{
  'id' => 'AA178E8213TBC9CABA',
  'licenseplate' => '8594FNC',
  'salesdesignation' => 'A Klass W177',
  'finorvin' => '1HM5F7F9XHD7C0861',
  'nickname' => 'mmueller',
  'modelyear' => '2018',
  'colorname' => 'black',
  'fueltype' => 'Benzin',
  'powerhp' => '163',
  'powerkw' => '122',
  'numberofdoors' => '5',
  'numberofseats' => '5'
}

Charge status

#charge(vehicle_id:)

It returns vehicle charge information

client.charge(vehicle_id: 'ABCD123').json

Response

{
  'stateofcharge' => {
    'value' => 80,
    'retrievalstatus' => 'VALID',
    'timestamp' => 1544019051,
    'unit' => 'PERCENT'
  }
}

Doors handling

#doors(vehicle_id:)

It returns vehicle doors status information

client.doors(vehicle_id: 'ABCD123').json

Response

{
  'doorstatusrearleft' => {
    'value' => 'CLOSED',
    'retrievalstatus' => 'VALID',
    'timestamp' => 1544018685
  },
  'doorlockstatusrearleft' => {
    'value' => 'LOCKED',
    'retrievalstatus' => 'VALID',
    'timestamp' => 1544018685
  },
  'doorstatusrearright' => {
    'value' => 'CLOSED',
    'retrievalstatus' => 'VALID',
    'timestamp' => 1544018685
  },
  'doorlockstatusrearright' => {
    'value' => 'LOCKED',
    'retrievalstatus' => 'VALID',
    'timestamp' => 1544018685
  },
  'doorstatusfrontright' => {
    'value' => 'CLOSED',
    'retrievalstatus' => 'VALID',
    'timestamp' => 1544018685
  },
  'doorlockstatusfrontright' => {
    'value' => 'LOCKED',
    'retrievalstatus' => 'VALID',
    'timestamp' => 1544018685
  },
  'doorstatusfrontleft' => {
    'value' =>' CLOSED',
    'retrievalstatus' => 'VALID',
    'timestamp' => 1544018685
  },
  'doorlockstatusfrontleft' => {
    'value' => 'LOCKED',
    'retrievalstatus' => 'VALID',
    'timestamp' => 1544018685
  },
  'doorlockstatusdecklid' => {
    'value' =>'UNLOCKED',
    'retrievalstatus'  => 'VALID',
    'timestamp' => 1544018685
  },
  'doorlockstatusgas' => {
    'value' => 'UNLOCKED',
    'retrievalstatus' => 'VALID',
    'timestamp' => 1544018685
  },
  'doorlockstatusvehicle' => {
    'value' => 'LOCKED',
    'retrievalstatus' => 'VALID',
    'timestamp' => 1544018685
  }
}
#lock_doors(vehicle_id:)

It locks vehicle doors

client.lock_doors(vehicle_id: 'ABCD123').ok?
#=> true
#unlock_doors(vehicle_id:)

It unlocks vehicle doors

client.unlock_doors(vehicle_id: 'ABCD123').ok?
#=> true

Fuel status

#fuel(vehicle_id:)

It returns vehicle fuel information

client.fuel(vehicle_id: 'ABCD123').json

Response

{
  'fuellevelpercent' => {
    'value' => 80,
    'retrievalstatus' => 'VALID',
    'timestamp' => 1544019329,
    'unit' => 'PERCENT'
  }
}

Location

#location(vehicle_id:)

It returns current vehicle location

client.location(vehicle_id: 'ABCD123').json

Response

{
  'longitude' => {
    'value' => 13.381815,
    'retrievalstatus' => 'VALID',
    'timestamp' => 1544019449
  },
  'latitude' => {
    'value' => 52.516506,
    'retrievalstatus' => 'VALID',
    'timestamp' => 1544019449
  },
  'heading' => {
    'value' => 52.520008,
    'retrievalstatus' => 'VALID',
    'timestamp' =>1544019449
  }
}

Odometer

#odometer(vehicle_id:)

It returns relevant vehicle information such as mileage

client.odometer(vehicle_id: 'ABCD123').json

Response

{
  'odometer' => {
    'value' => 3000,
    'retrievalstatus' => 'VALID',
    'timestamp' => 1544019575,
    'unit' =>'KILOMETERS'
  },
  'distancesincereset' => {
    'value' => 1234,
    'retrievalstatus' => 'VALID',
    'timestamp' => 1544019575,
    'unit' => 'KILOMETERS'
  },
  'distancesincestart' => {
    'value' => 276,
    'retrievalstatus' => 'VALID',
    'timestamp' => 1544019575,
    'unit' => 'KILOMETERS'
  }
}

Tires status

#tires(vehicle_id:)

It returns vehicle tires information

client.tires(vehicle_id: 'ABCD123').json

Response

{
  'tirepressurerearleft' => {
    'value' => 230,
    'retrievalstatus' => 'VALID',
    'timestamp' => 1544019784,
    'unit' => 'KILOPASCAL'
  },
  'tirepressurerearright' => {
    'value' => 230,
    'retrievalstatus' =>'VALID',
    'timestamp' => 1544019784,
    'unit' => 'KILOPASCAL'
  },
  'tirepressurefrontright' => {
    'value' => 230,
    'retrievalstatus' => 'VALID',
    'timestamp' => 1544019784,
    'unit' => 'KILOPASCAL'
  },
  'tirepressurefrontleft' => {
    'value' => 231,
    'retrievalstatus' => 'VALID',
    'timestamp' => 1544019784,
    'unit' => 'KILOPASCAL'
  }
}

Client errors

Mercedes::Client methods can raise several exceptions when performing requests:

  • Mercedes::Client::CarNotAvailable: Car is not available because it is not connected to the simulator. In order to fix that, go to https://car-simulator.developer.mercedes-benz.com
  • Mercedes::Client::Unauthorized: Request is not properly authenticated
  • Mercedes::Client::ServerError: Mercedes API is not responding
  • Mercedes::Client::NotFound: Resource is not found (404)

How to retrieve the authentication token

Mercedes API is secured with OAuth 2. Mercedes::Client need a valid access token to be able to perform requests against Mercedes API.

You can get a Client ID and a Client Secret at https://developer.mercedes-benz.com/console

Then you need to follow the OAuth workflow as described at: https://developer.mercedes-benz.com/content-page/oauth-documentation#_authorization_code_flow

Alternatively, this repository contains a small utility which can help to retrieve the access token.

You can either pass CLIENT_ID and CLIENT_SECRET as environment vars or just insert them when the script ask for them:

./bin/get_token

or

CLIENT_ID=**** CLIENT_SECRET=**** ./bin/get_token

The script will open the browser where you will need to sign in by using your Mercedes account. Mercedes site will redirect you to something like:

http://localhost/?code=355c72c1-821c-4378-88f0-2230a361d599

That URL contains the code that you need to insert back into the script. Then you will obtain the access_token:

{
  "access_token":"91890431-0cf8-433f-8c68-64727db14554",
  "token_type":"Bearer",
  "expires_in":3600,
  "refresh_token":"ede733e3-d076-4cb0-89f1-48568ae9c21e",
  "scope":"mb:vehicle:status:general mb:user:pool:reader"
}

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/alfonsojimenez/mercedes. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.

License

The gem is available as open source under the terms of the MIT License.