/psa_car_controller

control a psa car with connected_car v4 api. Using android app to retrieve credentials.

Primary LanguagePythonGNU General Public License v3.0GPL-3.0

Remote Control of PSA car

This is a python program to control a psa car with connected_car v4 api. Using android app to retrieve credentials.

I test it with a Peugeot e-208 but it works with others PSA vehicles (Citroen, Opel, Vauxhall, DS).

With this app you will be able to :

  • get the status of the car (battery level for electric vehicle, position ... )
  • start and stop the charge
  • set a charge threshold to limit the battery level to a certain percentage
  • set a stop hour to charge your vehicle only on off-peak hours
  • control air conditioning
  • control lights and horn if your vehicle is compatible (mine isn't)
  • get consumption statistic
  • visualize your trips on a map

The official api is documented here but it is not totally up to date, and contains some errors.

I. Get credentials

We need to get credentials from the android app. We will retrieve these informations:

  • client-id and client-secret for the api
  • some url to login

1.1 Download the app on your computer, the original MyPeugeot app can be downloaded here for example.

1.2 Install requirements :

  • On debian based distribution you can install some requirement from repos:

sudo apt-get install python3-typing-extensions python3-pandas python3-plotly python3-paho-mqtt python3-six python3-dateutil python3-brotli libblas-dev liblapack-dev gfortran python3-pycryptodome python3-numpy libatlas3-base

  • For everyone : pip3 install -r requirements.txt

1.3 run the decoder script : python3 app_decoder.py <path to my apk file>

mypeugeot email: <write your mypeugeot email>
mypeugeot password: <write your mypeugeot password>
What is the car api realm : clientsB2CPeugeot, clientsB2CDS, clientsB2COpel, clientsB2CVauxhall
clientsB2CPeugeot
What is your country code ? (ex: FR, GB, DE, ES...)
FR
save config change

Your vehicles: {'VINNUBMER': {'id': 'vehicule id'}}

1.4 If it works you will have VIN of your vehicles and there ids in the last line. The script generate a test.json file with all credentials needed.

II. Use the app

  1. start the app:

    Start the app with charge control enabled :

    python3 server.py -f test.json -c charge_config1.json

    At the first launch you will receive a SMS and you will be asked to give it and also give your pin code (the four-digit code that your use on the android app). If it failed you can remove the file otp.bin and retry.

    You can see all options available with : python3 server.py -h

  2. Test it

2.1 Get the car state :
http://localhost:5000/get_vehicleinfo/YOURVIN

2.2 Stop charge (only for solution 1)
http://localhost:5000/charge_now/YOURVIN/0

2.3 Set hour to stop the charge to 6am
http://localhost:5000/charge_control?vin=yourvin&hour=6&minute=0 

2.4 Change car charge threshold to 80 percent
http://localhost:5000/charge_control?vin=YOURVIN&percentage=80 

2.5 See the dashboard (only if record is enabled)
http://localhost:5000
  1. Dashboard and stats (Beta)

    You can add the -r argument to record the position of the vehicle and retrieve this information in a dashboard.

    python3 server.py -f test.json -c charge_config1.json -r

    You will be able to visualize your trips, your consumption and some statistics:

Screenshot_20210128_104519 You can add an api key for https://home.openweathermap.org/ in your config file. In the future version of the dashboard you will be able to see your consumption vs exterior temperature.

API documentation

The api documentation is described here : api_spec.md. You can use all functions from the doc, for example : myp.api().get_car_last_position(myp.get_vehicle_id_with_vin("myvin"))

More information

To analyse the traffics between the app and psa server, you can use mitmproxy. You will need the client certificate present in the apk at asssets/MWPMYMA1.pfx

# decrypt the pfx file (there is no password)
openssl pkcs12 -in MWPMYMA1.pfx -out MWPMYMA1.pem -nodes

Then you can use mitmproxy for example:

mitmproxy --set client_certs=MWPMYMA1.pem