It’s no secret that I’ve been working on getting a reliable readout from the OBDII connection on my electric motorcycles. These are my findings so far. My main goal was to find a way to get the battery temperature from the system. That is working, but my job is far from complete.
My initial “hacking” was focused on getting the Bluetooth Low Energy or BLE connection working with the bike. I knew from using the official My Energica app that there was data like SOC and power consumption available there. That turned out very easy and I reported that working in this blogpost Because it’s all about data, data, more data and… Animated Graphs to display that data.
The first surprise was that the bike has built in GPS. So I continued working on the app plotting that GPS information on a map. I made the app work with other bikes also by using the GPS connection on the phone. The last update on the Energ1ca app was showing nearby chargers while riding along. Below is a recording showing that functionality in action. Note that for visualisation speed has been increased (no I wasn’t riding that fast).
What I didn’t find in that BLE information was a battery temperature. It might still be in there cause I’m only parsing some of the received data and only have like 2 data requests. There are very likely more requests hidden still. Finding those requires a lot of guesswork as there is no working app that does that right now. And that guesswork is just to find the requests, then I’m not even talking about parsing the responses yet. Just have a look at the Energ1ca app source code if you ‘re interested.
If Energica themselves ever releases the connected ride feature they’ve been promising for years now then I might be able to reverse engineer that. But for now it’s just too much work and too much guesswork. I’ve seen screenshots from that promised app btw and they look very promising. Only downside I’ve seen so far is that our bikes will need a hardware update also. The “hub” labeled module underneath the tank covers (up front the DCFC communication module) has to be swapped out cause the one we have only has Bluetooth (GPS is in dash) and no 4G connection.
Now back to my own attempts. I’ve also used another third party app called Power Cruise Control that has an OBDII dongle and what looked like Energica specific information. At that moment it was an Android only app and it was still in closed Beta. I’ve seen it go public now so you should be able to just find it in the app store. The OBDII adapter can be found on Amazon. I’ve made this video where I shared my experience using that app.
Indeed I wasn’t very impressed. They have a very promising concept but the execution lacks for the moment. Plus it comes at a hefty cost. The dongle itself is reasonably priced given it actually works with the OBDII protocol way better than most chinese copies do. But for the App you have to pay a yearly license cost of 25 EUR. And that is per VIN you want to register. So if you have multiple bikes or a card and a bike that is supported you already have to double that cost.
Anyway I’ve contacted them with my concerns, some small bugs in the app but also, and mostly, that the kWh value they use in their calculations is wrong and that I can help them out. I also asked if they could share how they get the battery temperature value. My app feedback was totally ignored, my info request was countered with questions on what my intentions were with this info. I’ve explained what I do and how my apps are free and what I would use it for… Again never got a response.
So I started looking into the OBDII data myself. I created this repository where I share my general OBDII information. Things like how to get OBDII dongles connected, how to parse data, different standards and so on. I literally found just 2 generic OBDII commands that I could test out on both of my electric motorcycles. For more info on these check this wiki page.
|5B||91||1||Hybrid battery pack remaining life||0||100||%|
This 095B field (Service 09 PID 5B) for example should give us an indication of the remaining life of our high voltage battery pack. This was added to the standard for Hybrid vehicles looking at the name. And the value returned should be a so called State of Health or SOH. Not to be confused with State of Charger or SOC.
SOH is how much life is left in your battery after using it for many years. SOC is just how much charge it is currently at. Energica shows 100 % on that number. My zero surprisingly enough didn’t get that difference and just reports the SOC value instead.
Another OBDII standard value that I found related to electric vehicles is the one below. Sadly enough it didn’t give me any valid data on either bike plus there is also no formula included on how to parse the information.
|9A||154||6||Hybrid/EV Vehicle System Data, Battery, Voltage|
Next I started looking at the Energica specific information. Things like VIN and 12V battery voltage I can parse but those are just not that interesting. The one that caught my eye was the bottom one of this sequence:
ObdCommand("ATCAF1", "auto format ON"), ObdCommand("ATSH7E7", "SH 7E7"), ObdCommand("ATCRA7EF", "CRA 7EF"), ObdCommand("0142", "Control module voltage"), ObdCommand("0146", "Ambient air temperature"), ObdCommand("015B", "Hybrid battery SOH"), ObdCommand("ATCAF0", "auto format OFF"), ObdCommand("ATSH7DF", "SH 7DF"), ObdCommand("ATCRA200", "CRA 200"), ObdCommand("001", "Energica")
So I forked a proper OBDII bluetooth Android App with ELM327 chipset support into this quick App and started adapting it to extract that AT CRA 200 001 information. And there I had it, the 2 battery temperature values, the current SOC and some more values that clearly represent the power while riding and charging.
330 41.915828 LGElectr_2a:bf:68 (Nexus 5X) 66:1e:11:00:f1:43 (OBDII) SPP 18 Sent "001\r" 333 41.961850 66:1e:11:00:f1:43 (OBDII) LGElectr_2a:bf:68 (Nexus 5X) SPP 35 Rcvd "200164764170C01FFFE\r\r>" 200 16 // 22 in dec is one of the battery temp sensors 47 // 71 in dec matches SOC 64 // 100 in dec (no clue) 17 // 23 in dec matches the other battery temp sensor 0C 01 FF FE
As you can see I have most fields figured out. And I do know that the last 3 fields change while charging and represent that power output. I just dont know yet what the proper formula is to extract that information. In order to find that I’ll have to get more logs and then test some conversions. This is an example logged while charging AC at 3 kW.
64 16 0C 17 00 5A 64 16 0C 17 00 5B 64 16 0C 17 00 5D 64 16 0C 17 00 5D 64 16 0C 17 00 5C 64 16 0C 17 00 5C 64 16 0C 17 00 5C 64 16 0C 17 00 5A 64 16 0C 17 00 5B
For now I’ve been combining the logs I have from the BLE connection where I have charge power with these logs where I have battery temperature in order to get my information. And maybe one day I’ll look at them and just see how to parse it :D.
Update: I’ve put the formulas on that project repo. Below is an attempt to share these findings in a video… I know not my best one.
More Energica Specific OBDII values decoded, I have now SOC, SOH, Batt temp1 and 2 and Current