Showing posts with label Congress. Show all posts
Showing posts with label Congress. Show all posts

Friday, December 10, 2010

Nah, No LEAF for You!

At least not until late Summer 2011 according to Nissan.  In an email sent out to all Tier 2 reservations, Nissan announced that they would have to wait an additional 6 to 8 months before they would be able to order their cars.  Tier 2, according to Nissan, consists of the southern states along the Atlantic coast: specifically Alabama, Florida, Georgia, Maryland, North Carolina, South Carolina, Virginia and the District of Columbia.  Before this announcement, those states were supposed to be eligible to order the LEAF in December 2010.  However, 10 days into the month, the LEAF registrants received the following letter:

Hi xxxx, thank you for reserving your Nissan LEAF™. The response to this 100% electric car has been amazing.

Customers in your state will not be able to order until late summer 2011. In the meantime, we are working hard with our partners to further develop the charging infrastructure in your area so your entire ownership experience is of the highest quality.

If you have any other questions, please contact us through our Nissan LEAF live chat or by calling 877-NO-GAS-EV.

Upon receiving this letter, attempts were made to contact Nissan's friendly on-line chat service but they had apparently gone home for the weekend before the message was sent out.  The news comes on the heals of the feel-good story of the first Nissan LEAF delivery to occur this Saturday, 11 December in Redwood City, CA to a hero among his peers, an individual who goes by the handle Gudy on the My Nissan LEAF forums.  The cynical among us might therefore assume the timing this email corresponds with both hiding from customer repercussions as well as burying it under a very positive alternate story, namely the first LEAF delivery.

It's not clear at this time what reasons Nissan might have for the delay in the East Coast order schedule.  One possibility is to allow for the development of the Cold Weather Trim, but this doesn't make sense for places like Florida, where the weather rarely goes below 50.  Another possibility lies the company Nissan has contracted to do its installations for the Level-2 EVSE (Electric Vehicle Service Equipment) which can be used to charge the LEAF in up to 8 hours.  It is clear that no-one in the Tier 2 market has even been contacted by Aerovironment to schedule an assessment of the cost for installation of the EVSE which is a typical contingency for people ordering the LEAF.  However, many individuals in the Tier 2 market have already contacted Nissan requesting a waiver of the need for the assessment and installation of the Aerovironment equipment based on stories that earlier LEAF orders have told about inflated pricing.

However, the most likely answer seems to be over-estimates of demand and product availability as well as getting their dealerships LEAF Certified.  With the Yen currently trading at under 84¥ per $1 US, the cost to manufacture and import the LEAF into the US may be leading to negative profit margins on the vehicle.  This could be an indication that some of the initial LEAF production quota is being diverted to new markets, such as México as announced in a resent LEAF announcement on Twitter..  Clearly the capital, Ciudad de México, is a perfect place for the LEAF with its temperate climate, terrible emissions problems and robust middle class.  Another possibility is simply that manufacturing the LEAF is turning out to be more difficult and defect-prone than originally estimated and therefor Nissan has been forced to reduce the 2010 / 2011 production quotas.  As for the dealerships, at last check, of the 43 stores within 100 miles of me, 13 have yet to be LEAF Certified, including the rather large area chains of Pohanka and Darcars.  To become certified, the dealership must send people for LEAF training in Tennessee as well as install up to $50,000 in service equipment — an investment that is discounted under the EVSE Tax Credit by 50% up to twice that investment, but only until 31 December 2010.  Until we learn more, it seems probable that it be a combination of these factors which led to the decision.

One question still unanswered is if the $7,500 EV tax credit will be available if the late ordering window pushes back delivery into 2012, when the credit is set to expire.  Section 1141 of the American Investment and Recovery Act does not specify an expiration date for this credit but the new congress may see fit to add one.

Whatever the reason for the delay, one thing is clear: the Tier 2 ordering market will be followed closely by what is loosely called the forgotten 36 — a list of the states that are not in the first 2 ordering tiers for the Nissan LEAF.  And because a late summer order means, with a 4-7 month delivery window, as was quoted in recent correspondence from Nissan to people in the Tier 1 and Tier 1a markets (Arizona, California, Hawaii, Oregon, Tennessee, Texas and Washington), this would put both the Tier 2 and the forgotten 36 orders firmly in the LEAF 2012 model year.  What improvements may be added based on the first year of usage from people like Gudy receiving his car tomorrow may in the end leave those left hanging more fortunate for having waited.

Wednesday, November 10, 2010

Hold it there Electric Cowboy, not so fast...

Well, it looks like the Leviton Evr-Green EVSE isn't going to be available for Christmas this year after all. They've pushed their release for the EVB22-3PM back until January with the EVB45-3PD (the 7.6kW unit, and the one I want) hopefully out by April, but no guarantees doesn't look to be available for another year, well after I theoretically take possession of my LEAF.  But what Chris at Leviton explained to me with respect to the 2010 EVSE tax credit was even more distressing: simply wiring the home in 2010 would not qualify for the tax credit even if the EVSE wasn't available.  Zounds!  So I called my Congressman and left a message with his office to please please please do what he can to get the EVSE tax credit extended into 2011, when most J1772-compliant EVSE equipment will finally become available to the general consumer and when EVs will finally be made available to the general public.  I also asked for him to confirm the wiring restriction with respect to the tax credit.  Talk about catch-22: you can have the credit for an EVSE but no EVSEs will be available until that credit expires!?  I repeat, Zounds! And here I finally got my code together to scan the Better Business Bureau website for all the local Electrical Contractors with A+ ratings after a couple hours hacking last night, as can be seen in this Google Spreadsheet (Note: The month index is 0-based, meaning January is 0).  The code to do this had to query every sub-page of the 276 registered contractors and thus took quite a while to run, but here's the simple Python script I used to compile my data:
#!/usr/bin/python

import urllib2, sgmllib, re
data = file('BBBData.csv', 'w')
data.write('Name,Address,Area,Phone,"Join Year","Join Month"'
           + ',Rating\n')

months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul',
          'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
phone_pat = re.compile(r'phone:\s+\((?P\d{3})\)\s+' +
                       r'(?P\d{3}-\d{4})')
join_pat = re.compile(r'BBB\s+Accredited:\s+(?P' +
                      r'|'.join(months) +
                      r')\s+(?P\d{4})')
rating_pat = re.compile(r'Based on BBB files, this business '
                        +
                        r'has a BBB Rating of ([A-F][-+]?)')

class SGMLParse(sgmllib.SGMLParser):
    def __init__(self, verbose=False):
        sgmllib.SGMLParser.__init__(self, verbose)
        self.div_depth = 0
        self.stores = []
        self.inentry = False
        self.inname = False
        self.current_name = None
        self.inaddr = False
        self.current_addr = None
        self.current = None
        self.inphone = False
        self.current_join = None
        self.current_phone = None
        self.last_href = None
        self.current_rating = None

    def parse(self, text):
        self.feed(text)
        self.close()

    def start_div(self, attributes):
        self.div_depth += 1
        classes = [ ]
        attr = dict(attributes)
        if attr.has_key('class'):
            classes = attr['class'].split(' ')

        if 'StdList' in classes:
            self.inentry = self.div_depth
        elif 'StdListName' in classes:
            self.inname = self.div_depth
            self.current = ''
        elif 'StdListAddr' in classes:
            self.inaddr = self.div_depth
            self.current = ''
        elif 'StdListPhone' in classes:
            self.inphone = self.div_depth
            self.current = ''

    def end_div(self):
        if self.inentry == self.div_depth:
            # Collect data and append
            self.stores.append({'Name': self.current_name,
                                'Address': self.current_addr,
                                'Joined': self.current_join,
                                'Phone': self.current_phone,
                                'Rating': self.current_rating
                               })
            data.write('"'+self.current_name+'",')
            data.write('"'+self.current_addr+'",')
            data.write('"'+self.current_phone[0]+'",')
            data.write('"'+self.current_phone[1]+'",')
            data.write(''+str(self.current_join[1])+',')
            data.write(''+str(self.current_join[0])+',')
            data.write('"'+str(self.current_rating)+'"\n')

            self.current_name = None
            self.current_address = None
            self.current_join = None
            self.current_phone = None
            self.current_rating = None
            self.inentry = False
        elif self.inname == self.div_depth:
            self.current_name = self.current
            self.current = None
            self.inname = False
        elif self.inaddr == self.div_depth:
            self.current_addr = self.current
            self.current = None
            self.inaddr = False
        elif self.inphone == self.div_depth:
            for line in self.current.split('\n'):
                match = join_pat.match(line)
                if match:
                    self.current_join = (months.index(match.
                                            group('month')),
                                         int(match.
                                            group('year')))
                else:
                    match = phone_pat.match(line)
                    if match:
                        if self.current_phone != None:
                            print 'Duplicate Phone Number'
                        self.current_phone = (match.
                                                group(
                                                  'area'),
                                              match.
                                                group('num'))
            self.current = None
            self.inphone = False
        self.div_depth -= 1

    def start_a(self, attributes):
        attr = dict(attributes)
        if self.inentry:
            self.last_href = 'http://dc-easternpa.bbb.org/' \
                             + attr['href']
            self.current = ''

    def end_a(self):
        if self.inentry and self.current == 'BBB report':
            match = rating_pat.search(urllib2.urlopen(self.
                      last_href).read())
            if match:
                self.current_rating = match.group(1)
            self.current = None

        self.last_href = None

    def handle_data(self, data):
        if self.current is not None:
            self.current += data

    def start_br(self, attributes):
        if self.current is not None:
            self.current += '\n'

    def handle_entityref(self, entity):
        if entity.lower() == 'nbsp' and self.current is not \
             None:
            self.current += ' '

        return self.convert_entityref(entity)

BBBListHTML = urllib2.urlopen('http://dc-easternpa.bbb.org/'
                              + 'V2RosterByTob.asp?ID=10049')

p = SGMLParse()
p.parse(''.join(BBBListHTML.readlines()))

data.close()
# p.stores contains a list of dictionaries with each store's
# data
Note: Edited for line length