[Ovmsdev] Leaf Development

Tom Parker tom at carrott.org
Thu Feb 25 19:24:19 HKT 2016

On 02/25/2016 10:17 PM, Thor wrote:
> nice!
> Sorry can't help with the developing, since it's not my field of 
> programming.
> But have you considered setting up a donation for leaf development? 
> there has been a demand for leaf-alternative a long time, and the devs 
> here that worked on it have left.
> One of the devs Jermey has no leaf no more, so no pushing for the 
> leaf. It's very important that the leaf development now pushes forward 
> to get somewhere and not halt before we get there.
Donations of sleep would be helpful, but difficult to arrange.

I expect I'll have remote climate control working in the next couple of 
weeks. https://carmanuals2.com/brand/nissan/leaf-2012-372 looks like the 
TCU (AV Page 64) and charger (VC page 24) use different signals to wake 
up the VCU (charger is 5v, TCU is 12v). I can't promise much more than 
remote climate control, monitoring of the battery temperature and 
discovering the source of a clicking relay every 20 seconds or so (I've 
only seen the clicking relay once, so not sure what is causing that).

> How will your code be with the new hardware that is comming?
Looking at the leaf support, the CAN setup and the CAN transmit code is 
obviously hardware dependent. Is there an abstracted CAN tx function 
lurking somewhere? Something like a sendCanMsg(id, length, data) 
function? I get that might be difficult on the PIC with the limited 
stack, but a macro ought to work if that is a problem.

Unless we do a run of special OVMSv2 boards, the Gen 1 Leaf is going to 
need some fiddly hardware mods for remote control to work. We should add 
exposed GPIO with suitable over voltage etc protection to the OVMS v3 
wish list if it isn't there already. I'm thinking I'll use one of the 
spare pins on the diag connector on my v2 module so I don't have squeeze 
another connector onto the case.
> Anyways. I did a poll last year on how many that where interested in 
> changing to a opensource alternative for carwings/nissan connect. and 
> like 30-40 said yes. I estimate that atleast 60 leafs are interested 
> in norway.
> ps: I think the number for opensource alternative might be even higher 
> now after the Nissan disaster:
> http://www.troyhunt.com/2016/02/controlling-vehicle-features-of-nissan.html?m=1
>        I tested the security hole yesterday, and it was wide open. 
> today it's partialy closed. look at the response time before nissan 
> acted on it. it's a disaster.
Saw that, what were they thinking? Nissan updated the server & app last 
month was that worldwide? Is the problem with the new system or the old 
one? Did the old software require credentials? If so, why on earth 
didn't they carry them over (I see some people have been grumbling about 
having to re-register).

I haven't looked too closely at the OVMS security other than to note RC4 
and MD5 are pretty old primitives, and I'd have to look a lot closer at 
how and why HMAC MD5 is used to comment further. I'm not up on the state 
of SMS source authentication, is it easy to spoof a source address, or 
does that really require spoofing the cell network itself which probably 
means being close to the car? I also wouldn't rule out sniffing the 
password from an SMS going over the air, but I guess that's not a threat 
we're going to face very often.

As an aside, the following python script might be useful when invoked 
like so

$ download.py https://carmanuals2.com/brand/nissan/leaf-2012-372 

#! /usr/bin/python3

from html.parser import HTMLParser
import os.path
import re
import requests
import sys

start_url = sys.argv[1]
book_parent = sys.argv[2]

def get_book(book_url):
   book_id = book_url.split("-")[-1]
   download_url = "https://carmanuals2.com/d/" + book_id
   filename = book_url[len(book_parent):] + ".pdf"
   if os.path.exists(filename):
     print("Skipping", download_url, "as", filename, "exists")
   print("Saving", download_url, "to", filename)
   with open(filename, 'wb') as handle:
     r = requests.get(download_url, stream=True)

     if not r.ok:
       raise ValueError(r.response_code)

     for block in r.iter_content(1024):

class MyHTMLParser(HTMLParser):
   def handle_starttag(self, tag, attrs):
     if tag == "a":
       book_url = list(filter(lambda x: x[0] == 'href', attrs))[0][1]
       if re.match(".*-[0-9]+$", book_url):
         if book_url.startswith(book_parent):

r = requests.get(start_url)
parser = MyHTMLParser()

And the following terrible shell script, when run in the directory 
containing the pdf files will rename the relevant ones so they link 
together properly:

#! /bin/bash

for F in *
         TITLE=`pdfinfo $F | grep Title | cut -c 17-`
         if [[ $TITLE == *Config* ]]
                 NAME=`echo $TITLE | cut -d '(' -f 2 | cut -d '.' -f 1`
                 echo $F $TITLE $NAME.pdf
                 mv $F $NAME.pdf

More information about the OvmsDev mailing list