Skip to main content

Communicate and control your Jaguar I-Pace

Project description


Join the chat at

Python 3 library for interacting with the JLR Remote car API.


The associated API documentation for the JLR InControl API is a good read for anyone wanting to make use of this project. It's currently available here

Help Needed

As I currently do not own a vehicle yet the work represented here is the result of static analysis. If anyone with a vehicle is willing to help me reverse the protocol further, please let me known on Gitter. Also, be sure to check out any available pull requests and test out the described functionality there.

Security notice

The SSL certificates used by JLR are issued by GeoTrust in 2017. Both Apple and Google have distrusted these and others after faliure to comply with industry standards for SSL. If you are running MacOS you will currently get SSL verification errors and subsequently you will be unable to use this script without modifications. To disable SSL verification you can check out this guide.


To get started, instantiate a Connection object and pass along the email address and password associated with your Jaguar InControl account.

The JLR API requires a device ID to be registered (UUID4 formatted). If you do not specify one when instantiating the Connection object it will generate a new one for your automatically.

import jlrpy

c = jlrpy.Connection('', 'password')
v = c.vehicles[0]

Connection.vehicles will list all vehicles assosiated with your account.

# Get user information
# Get attributes associated with vehicle
# Get current status of vehicle
# Get subscription packes
# Get trip data (last 1000 trips).
# Get data for a single trip (specified with trip id)
# Get vehicle health status
# Get departure timers
# Get configured wakeup time
# Honk horn and blink lights
# Get current position of vehicle
# Start preconditioning at 21.0C
# Stop preconditioning
# Lock vehicle
# Unlock vehicle
# Start charging
# Stop charging
# Set max soc at 80% (Requires upcoming OTA update)
# Set max soc for current charging session to 90% (Requires upcoming OTA update)
# Add single departure timer (index, year, month, day, hour, minute)
v.add_departure_timer(10, 2019, 1, 30, 20, 30)
# Delete a single departure timer index.
# Schedule repeated departure timer.
schedule = {"friday":false,"monday":true,"saturday":false,"sunday":false,"thursday":false,"tuesday":true,"wednesday":true}
v.add_repeated_departure_timer(10, 20, 30, schedule)
# Set wakeup timer (epoch millis)
# Enable service mode (requires personal PIN)
v.enable_service_mode("1234", 1547551847000)
# Enable transport mode (requires personal PIN)
v.enable_transport_mode("1234", 1547551847000)
# Enable privacy mode
# Disable privacy mode
# Add charging period with specified index identifier value.
v.add_charging_period(1, schedule, 0, 30, 8, 45)
# Reverse geocode


The examples directory contains example scripts that put jlrpy to good use.

The script allows you to specify a desired maximum and minimum state of charge for the vehicle. Charging will be stopped once the maximum state of charge is reached and it will be started if the minimum state of charge is reached.

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

jlrpy-1.0.18.tar.gz (6.9 kB view hashes)

Uploaded source

Built Distribution

jlrpy-1.0.18-py3-none-any.whl (7.9 kB view hashes)

Uploaded py3

Supported by

AWS AWS Cloud computing Datadog Datadog Monitoring Facebook / Instagram Facebook / Instagram PSF Sponsor Fastly Fastly CDN Google Google Object Storage and Download Analytics Huawei Huawei PSF Sponsor Microsoft Microsoft PSF Sponsor NVIDIA NVIDIA PSF Sponsor Pingdom Pingdom Monitoring Salesforce Salesforce PSF Sponsor Sentry Sentry Error logging StatusPage StatusPage Status page