Joseph Varner
Published © GPL3+

OBD II Information Logger and Diagnostics Reader

Reads and logs information from a vehicles ECU Raspberry Pi and an ELM 327 USB to OBDII cable.

IntermediateWork in progress16,435
OBD II Information Logger and Diagnostics Reader

Things used in this project

Hardware components

Raspberry Pi 2 Model B
Raspberry Pi 2 Model B
×1
ELM 327 OBDII Interface
×1
Wireless N USB Adapter
×1

Story

Read more

Code

Live Capture

Python
This looks at which of sensors defined in the "Sort sensor data" script your car will allow to output through the OBDII port. It then displays live output data from the "Sort sensor data" script in the terminal updating every half second.
#!/usr/bin/env python

import obd_io
import serial
import platform
import obd_sensors
from datetime import datetime
import time

from obd_utils import scanSerial

class OBD_Capture():
    def __init__(self):
        self.port = None
        localtime = time.localtime(time.time())

    def connect(self):
        portnames = scanSerial()
        print portnames
        for port in portnames:
            self.port = obd_io.OBDPort(port, None, 2, 2)
            if(self.port.State == 0):
                self.port.close()
                self.port = None
            else:
                break

        if(self.port):
            print "Connected to "+self.port.port.name
            
    def is_connected(self):
        return self.port
        
    def capture_data(self):

        #Find supported sensors - by getting PIDs from OBD
        # its a string of binary 01010101010101 
        # 1 means the sensor is supported
        self.supp = self.port.sensor(0)[1]
        self.supportedSensorList = []
        self.unsupportedSensorList = []

        # loop through PIDs binary
        for i in range(0, len(self.supp)):
            if self.supp[i] == "1":
                # store index of sensor and sensor object
                self.supportedSensorList.append([i+1, obd_sensors.SENSORS[i+1]])
            else:
                self.unsupportedSensorList.append([i+1, obd_sensors.SENSORS[i+1]])
        
        for supportedSensor in self.supportedSensorList:
            print "supported sensor index = " + str(supportedSensor[0]) + " " + str(supportedSensor[1].shortname)        
        
        time.sleep(3)
        
        if(self.port is None):
            return None

        #Loop until Ctrl C is pressed        
        try:
            while True:
                localtime = datetime.now()
                current_time = str(localtime.hour)+":"+str(localtime.minute)+":"+str(localtime.second)+"."+str(localtime.microsecond)
                log_string = current_time + "\n"
                results = {}
                for supportedSensor in self.supportedSensorList:
                    sensorIndex = supportedSensor[0]
                    (name, value, unit) = self.port.sensor(sensorIndex)
                    log_string += name + " = " + str(value) + " " + str(unit) + "\n"

                print log_string,
                time.sleep(0.5)

        except KeyboardInterrupt:
            self.port.close()
            print("stopped")

if __name__ == "__main__":

    o = OBD_Capture()
    o.connect()
    time.sleep(3)
    if not o.is_connected():
        print "Not connected"
    else:
        o.capture_data()

Sort sensor data

Python
This script sets definitions to the incoming data from the car's ecu. It then converts the data received to readable formats by sending the data through functions listed in the beginning of the script.
 #!/usr/bin/env python
###########################################################################
# obd_sensors.py
#
# Copyright 2004 Donour Sizemore (donour@uchicago.edu)
# Copyright 2009 Secons Ltd. (www.obdtester.com)
#
# This file is part of pyOBD.
#
# pyOBD is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# pyOBD is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with pyOBD; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
###########################################################################

def hex_to_int(str):
    i = int(("0x" + str), 16)
    #i = eval("0x" + str, {}, {})
    return i

def maf(code):
    code = hex_to_int(code)
    return int(code)/100
def throttle_pos(code):
    code = hex_to_int(code)
    return int(code * 100.0 / 255.0)

def intake_m_pres(code): # in kPa
    code = hex_to_int(code)
    return (code * 0.0014504)-14.7
  
def rpm(code):
    code = hex_to_int(code)
    return code / 4

def speed(code):
    code = hex_to_int(code)
    return code * 0.62137 #in MPH

def percent_scale(code):
    code = hex_to_int(code)
    return code * 100.0 / 255.0

def timing_advance(code):
    code = hex_to_int(code)
    return (code / 2.0) - 64.0

def sec_to_min(code):
    code = hex_to_int(code)
    return code / 60

def temp(code):
    code = hex_to_int(code)
    c = code - 40 
    return c

def cpass(code):
    #fixme
    return code

def fuel_trim_percent(code):
    code = hex_to_int(code)
    #return (code - 128.0) * 100.0 / 128
    return (code - 128) * 100 / 128

def dtc_decrypt(code):
    #first byte is byte after PID and without spaces
    num = hex_to_int(code[:2]) #A byte
    res = []

    if num & 0x80: # is mil light on
        mil = 1
    else:
        mil = 0
        
    # bit 0-6 are the number of dtc's. 
    num = num & 0x7f
    
    res.append(num)
    res.append(mil)
    
    numB = hex_to_int(code[2:4]) #B byte
      
    for i in range(0,3):
        res.append(((numB>>i)&0x01)+((numB>>(3+i))&0x02))
    
    numC = hex_to_int(code[4:6]) #C byte
    numD = hex_to_int(code[6:8]) #D byte
       
    for i in range(0,7):
        res.append(((numC>>i)&0x01)+(((numD>>i)&0x01)<<1))
    
    res.append(((numD>>7)&0x01)) #EGR SystemC7  bit of different 
    
    #return res
    return '#'

def hex_to_bitstring(str):
    bitstring = ""
    for i in str:
        # silly type safety, we don't want to eval random stuff
        if type(i) == type(''): 
            v = eval("0x%s" % i)
            if v & 8 :
                bitstring += '1'
            else:
                bitstring += '0'
            if v & 4:
                bitstring += '1'
            else:
                bitstring += '0'
            if v & 2:
                bitstring += '1'
            else:
                bitstring += '0'
            if v & 1:
                bitstring += '1'
            else:
                bitstring += '0'                
    return bitstring

class Sensor:
    def __init__(self, shortName, sensorName, sensorcommand, sensorValueFunction, u):
        self.shortname = shortName
        self.name = sensorName
        self.cmd  = sensorcommand
        self.value= sensorValueFunction
        self.unit = u

SENSORS = [
    Sensor("pids"                  , "Supported PIDs"				, "0100" , hex_to_bitstring ,""       ), 
    Sensor("dtc_status"            , "S-S DTC Cleared"				, "0101" , dtc_decrypt      ,""       ),    
    Sensor("dtc_ff"                , "DTC C-F-F"					, "0102" , cpass            ,""       ),      
    Sensor("fuel_status"           , "Fuel System Stat"				, "0103" , cpass            ,""       ),
    Sensor("load"                  , "Calc Load Value"				, "0104", percent_scale    ,"%"       ), #1   
    Sensor("temp"                  , "Coolant Temp"					, "0105" , temp             ,"C"      ),
    Sensor("short_term_fuel_trim_1", "S-T Fuel Trim"				, "0106" , fuel_trim_percent,"%"      ),
    Sensor("long_term_fuel_trim_1" , "L-T Fuel Trim"				, "0107" , fuel_trim_percent,"%"      ),
    Sensor("short_term_fuel_trim_2", "S-T Fuel Trim"				, "0108" , fuel_trim_percent,"%"      ),
    Sensor("long_term_fuel_trim_2" , "L-T Fuel Trim"				, "0109" , fuel_trim_percent,"%"      ),
    Sensor("fuel_pressure"         , "FuelRail Pressure"			, "010A" , cpass            ,""       ),
    Sensor("manifold_pressure"     , "Intk Manifold"				, "010B" , intake_m_pres    ,"psig"    ),
    Sensor("rpm"                   , "Engine RPM"					, "010C", rpm              ,"rpm"       ),#1
    Sensor("speed"                 , "Vehicle Speed"				, "010D", speed            ,"mi/h"    ),#1
    Sensor("timing_advance"        , "Timing Advance"				, "010E" , timing_advance   ,"degrees"),
    Sensor("intake_air_temp"       , "Intake Air Temp"				, "010F" , temp             ,"C"      ),
    Sensor("maf"                   , "AirFlow Rate(MAF)"			, "0110" , maf              ,"lb/min" ),
    Sensor("throttle_pos"          , "Throttle Position"			, "0111", throttle_pos     ,"%"      ),#1
    Sensor("secondary_air_status"  , "2nd Air Status"				, "0112" , cpass            ,""       ),
    Sensor("o2_sensor_positions"   , "Loc of O2 sensors"			, "0113" , cpass            ,""       ),
    Sensor("o211"                  , "O2 Sensor: 1 - 1"				, "0114" , fuel_trim_percent,"%"      ),
    Sensor("o212"                  , "O2 Sensor: 1 - 2"				, "0115" , fuel_trim_percent,"%"      ),
    Sensor("o213"                  , "O2 Sensor: 1 - 3"				, "0116" , fuel_trim_percent,"%"      ),
    Sensor("o214"                  , "O2 Sensor: 1 - 4"				, "0117" , fuel_trim_percent,"%"      ),
    Sensor("o221"                  , "O2 Sensor: 2 - 1"				, "0118" , fuel_trim_percent,"%"      ),
    Sensor("o222"                  , "O2 Sensor: 2 - 2"				, "0119" , fuel_trim_percent,"%"      ),
    Sensor("o223"                  , "O2 Sensor: 2 - 3"				, "011A" , fuel_trim_percent,"%"      ),
    Sensor("o224"                  , "O2 Sensor: 2 - 4"				, "011B" , fuel_trim_percent,"%"      ),
    Sensor("obd_standard"          , "OBD Designation"				, "011C" , cpass            ,""       ),
    Sensor("o2_sensor_position_b"  , "Loc of O2 sensor" 			, "011D" , cpass            ,""       ),
    Sensor("aux_input"             , "Aux input status"				, "011E" , cpass            ,""       ),
    Sensor("engine_time"           , "Engine Start MIN"				, "011F" , sec_to_min       ,"min"    ),
    Sensor("engine_mil_time"       , "Engine Run MIL"				, "014D" , sec_to_min       ,"min"    ),
    ]
     
    
#___________________________________________________________

def test():
    for i in SENSORS:
        print (i.name, i.value("F"))

if __name__ == "__main__":
		test()

OBDII codes

Python
Many of the OBDII error codes were listed here for use in the capture script. "P1" codes can be added to the file to account for manufacturer-specific error codes.
 #!/usr/bin/env python
###########################################################################
# obd_sensors.py
#
# Copyright 2004 Donour Sizemore (donour@uchicago.edu)
# Copyright 2009 Secons Ltd. (www.obdtester.com)
#
# This file is part of pyOBD.
#
# pyOBD is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# pyOBD is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with pyOBD; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
###########################################################################
pcodes = {
	"P0001": "Fuel Volume Regulator Control Circuit/Open",
	"P0002": "Fuel Volume Regulator Control Circuit Range/Performance",
	"P0003": "Fuel Volume Regulator Control Circuit Low",
	"P0004": "Fuel Volume Regulator Control Circuit High",
	"P0005": "Fuel Shutoff Valve 'A' Control Circuit/Open",
	"P0006": "Fuel Shutoff Valve 'A' Control Circuit Low",
	"P0007": "Fuel Shutoff Valve 'A' Control Circuit High",
	"P0008": "Engine Position System Performance",
	"P0009": "Engine Position System Performance",
	"P0010": "'A' Camshaft Position Actuator Circuit",
	"P0011": "'A' Camshaft Position - Timing Over-Advanced or System Performance",
	"P0012": "'A' Camshaft Position - Timing Over-Retarded",
	"P0013": "'B' Camshaft Position - Actuator Circuit",
	"P0014": "'B' Camshaft Position - Timing Over-Advanced or System Performance",
	"P0015": "'B' Camshaft Position - Timing Over-Retarded",
	"P0016": "Crankshaft Position - Camshaft Position Correlation",
	"P0017": "Crankshaft Position - Camshaft Position Correlation",
	"P0018": "Crankshaft Position - Camshaft Position Correlation",
	"P0019": "Crankshaft Position - Camshaft Position Correlation",
	"P0020": "'A' Camshaft Position Actuator Circuit",
	"P0021": "'A' Camshaft Position - Timing Over-Advanced or System Performance",
	"P0022": "'A' Camshaft Position - Timing Over-Retarded",
	"P0023": "'B' Camshaft Position - Actuator Circuit",
	"P0024": "'B' Camshaft Position - Timing Over-Advanced or System Performance",
	"P0025": "'B' Camshaft Position - Timing Over-Retarded",
	"P0026": "Intake Valve Control Solenoid Circuit Range/Performance",
	"P0027": "Exhaust Valve Control Solenoid Circuit Range/Performance",
	"P0028": "Intake Valve Control Solenoid Circuit Range/Performance",
	"P0029": "Exhaust Valve Control Solenoid Circuit Range/Performance",
	"P0030": "HO2S Heater Control Circuit",
	"P0031": "HO2S Heater Control Circuit Low",
	"P0032": "HO2S Heater Control Circuit High",
	"P0033": "Turbo Charger Bypass Valve Control Circuit",
	"P0034": "Turbo Charger Bypass Valve Control Circuit Low",
	"P0035": "Turbo Charger Bypass Valve Control Circuit High",
	"P0036": "HO2S Heater Control Circuit",
	"P0037": "HO2S Heater Control Circuit Low",
	"P0038": "HO2S Heater Control Circuit High",
	"P0039": "Turbo/Super Charger Bypass Valve Control Circuit Range/Performance",
	"P0040": "O2 Sensor Signals Swapped Bank 1 Sensor 1/ Bank 2 Sensor 1",
	"P0041": "O2 Sensor Signals Swapped Bank 1 Sensor 2/ Bank 2 Sensor 2",
	"P0042": "HO2S Heater Control Circuit",
	"P0043": "HO2S Heater Control Circuit Low",
	"P0044": "HO2S Heater Control Circuit High",
	"P0045": "Turbo/Super Charger Boost Control Solenoid Circuit/Open",
	"P0046": "Turbo/Super Charger Boost Control Solenoid Circuit Range/Performance",
	"P0047": "Turbo/Super Charger Boost Control Solenoid Circuit Low",
	"P0048": "Turbo/Super Charger Boost Control Solenoid Circuit High",
	"P0049": "Turbo/Super Charger Turbine Overspeed",
	"P0050": "HO2S Heater Control Circuit",
	"P0051": "HO2S Heater Control Circuit Low",
	"P0052": "HO2S Heater Control Circuit High",
	"P0053": "HO2S Heater Resistance",
	"P0054": "HO2S Heater Resistance",
	"P0055": "HO2S Heater Resistance",
	"P0056": "HO2S Heater Control Circuit",
	"P0057": "HO2S Heater Control Circuit Low",
	"P0058": "HO2S Heater Control Circuit High",
	"P0059": "HO2S Heater Resistance",
	"P0060": "HO2S Heater Resistance",
	"P0061": "HO2S Heater Resistance",
	"P0062": "HO2S Heater Control Circuit",
	"P0063": "HO2S Heater Control Circuit Low",
	"P0064": "HO2S Heater Control Circuit High",
	"P0065": "Air Assisted Injector Control Range/Performance",
	"P0066": "Air Assisted Injector Control Circuit or Circuit Low",
	"P0067": "Air Assisted Injector Control Circuit High",
	"P0068": "MAP/MAF - Throttle Position Correlation",
	"P0069": "Manifold Absolute Pressure - Barometric Pressure Correlation",
	"P0070": "Ambient Air Temperature Sensor Circuit",
	"P0071": "Ambient Air Temperature Sensor Range/Performance",
	"P0072": "Ambient Air Temperature Sensor Circuit Low",
	"P0073": "Ambient Air Temperature Sensor Circuit High",
	"P0074": "Ambient Air Temperature Sensor Circuit Intermittent",
	"P0075": "Intake Valve Control Solenoid Circuit",
	"P0076": "Intake Valve Control Solenoid Circuit Low",
	"P0077": "Intake Valve Control Solenoid Circuit High",
	"P0078": "Exhaust Valve Control Solenoid Circuit",
	"P0079": "Exhaust Valve Control Solenoid Circuit Low",
	"P0080": "Exhaust Valve Control Solenoid Circuit High",
	"P0081": "Intake Valve Control Solenoid Circuit",
	"P0082": "Intake Valve Control Solenoid Circuit Low",
	"P0083": "Intake Valve Control Solenoid Circuit High",
	"P0084": "Exhaust Valve Control Solenoid Circuit",
	"P0085": "Exhaust Valve Control Solenoid Circuit Low",
	"P0086": "Exhaust Valve Control Solenoid Circuit High",
	"P0087": "Fuel Rail/System Pressure - Too Low",
	"P0088": "Fuel Rail/System Pressure - Too High",
	"P0089": "Fuel Pressure Regulator 1 Performance",
	"P0090": "Fuel Pressure Regulator 1 Control Circuit",
	"P0091": "Fuel Pressure Regulator 1 Control Circuit Low",
	"P0092": "Fuel Pressure Regulator 1 Control Circuit High",
	"P0093": "Fuel System Leak Detected - Large Leak",
	"P0094": "Fuel System Leak Detected - Small Leak",
	"P0095": "Intake Air Temperature Sensor 2 Circuit",
	"P0096": "Intake Air Temperature Sensor 2 Circuit Range/Performance",
	"P0097": "Intake Air Temperature Sensor 2 Circuit Low",
	"P0098": "Intake Air Temperature Sensor 2 Circuit High",
	"P0099": "Intake Air Temperature Sensor 2 Circuit Intermittent/Erratic",
	"P0100": "Mass or Volume Air Flow Circuit",
	"P0101": "Mass or Volume Air Flow Circuit Range/Performance",
	"P0102": "Mass or Volume Air Flow Circuit Low Input",
	"P0103": "Mass or Volume Air Flow Circuit High Input",
	"P0104": "Mass or Volume Air Flow Circuit Intermittent",
	"P0105": "Manifold Absolute Pressure/Barometric Pressure Circuit",
	"P0106": "Manifold Absolute Pressure/Barometric Pressure Circuit Range/Performance",
	"P0107": "Manifold Absolute Pressure/Barometric Pressure Circuit Low Input",
	"P0108": "Manifold Absolute Pressure/Barometric Pressure Circuit High Input",
	"P0109": "Manifold Absolute Pressure/Barometric Pressure Circuit Intermittent",
	"P0110": "Intake Air Temperature Sensor 1 Circuit",
	"P0111": "Intake Air Temperature Sensor 1 Circuit Range/Performance",
	"P0112": "Intake Air Temperature Sensor 1 Circuit Low",
	"P0113": "Intake Air Temperature Sensor 1 Circuit High",
	"P0114": "Intake Air Temperature Sensor 1 Circuit Intermittent",
	"P0115": "Engine Coolant Temperature Circuit",
	"P0116": "Engine Coolant Temperature Circuit Range/Performance",
	"P0117": "Engine Coolant Temperature Circuit Low",
	"P0118": "Engine Coolant Temperature Circuit High",
	"P0119": "Engine Coolant Temperature Circuit Intermittent",
	"P0120": "Throttle/Pedal Position Sensor/Switch 'A' Circuit",
	"P0121": "Throttle/Pedal Position Sensor/Switch 'A' Circuit Range/Performance",
	"P0122": "Throttle/Pedal Position Sensor/Switch 'A' Circuit Low",
	"P0123": "Throttle/Pedal Position Sensor/Switch 'A' Circuit High",
	"P0124": "Throttle/Pedal Position Sensor/Switch 'A' Circuit Intermittent",
	"P0125": "Insufficient Coolant Temperature for Closed Loop Fuel Control",
	"P0126": "Insufficient Coolant Temperature for Stable Operation",
	"P0127": "Intake Air Temperature Too High",
	"P0128": "Coolant Thermostat (Coolant Temperature Below Thermostat Regulating Temperature)",
	"P0129": "Barometric Pressure Too Low",
	"P0130": "O2 Sensor Circuit",
	"P0131": "O2 Sensor Circuit Low Voltage",
	"P0132": "O2 Sensor Circuit High Voltage",
	"P0133": "O2 Sensor Circuit Slow Response",
	"P0134": "O2 Sensor Circuit No Activity Detected",
	"P0135": "O2 Sensor Heater Circuit",
	"P0136": "O2 Sensor Circuit",
	"P0137": "O2 Sensor Circuit Low Voltage",
	"P0138": "O2 Sensor Circuit High Voltage",
	"P0139": "O2 Sensor Circuit Slow Response",
	"P0140": "O2 Sensor Circuit No Activity Detected",
	"P0141": "O2 Sensor Heater Circuit",
	"P0142": "O2 Sensor Circuit",
	"P0143": "O2 Sensor Circuit Low Voltage",
	"P0144": "O2 Sensor Circuit High Voltage",
	"P0145": "O2 Sensor Circuit Slow Response",
	"P0146": "O2 Sensor Circuit No Activity Detected",
	"P0147": "O2 Sensor Heater Circuit",
	"P0148": "Fuel Delivery Error",
	"P0149": "Fuel Timing Error",
	"P0150": "O2 Sensor Circuit",
	"P0151": "O2 Sensor Circuit Low Voltage",
	"P0152": "O2 Sensor Circuit High Voltage",
	"P0153": "O2 Sensor Circuit Slow Response",
	"P0154": "O2 Sensor Circuit No Activity Detected",
	"P0155": "O2 Sensor Heater Circuit",
	"P0156": "O2 Sensor Circuit",
	"P0157": "O2 Sensor Circuit Low Voltage",
	"P0158": "O2 Sensor Circuit High Voltage",
	"P0159": "O2 Sensor Circuit Slow Response",
	"P0160": "O2 Sensor Circuit No Activity Detected",
	"P0161": "O2 Sensor Heater Circuit",
	"P0162": "O2 Sensor Circuit",
	"P0163": "O2 Sensor Circuit Low Voltage",
	"P0164": "O2 Sensor Circuit High Voltage",
	"P0165": "O2 Sensor Circuit Slow Response",
	"P0166": "O2 Sensor Circuit No Activity Detected",
	"P0167": "O2 Sensor Heater Circuit",
	"P0168": "Fuel Temperature Too High",
	"P0169": "Incorrect Fuel Composition",
	"P0170": "Fuel Trim",
	"P0171": "System Too Lean",
	"P0172": "System Too Rich",
	"P0173": "Fuel Trim",
	"P0174": "System Too Lean",
	"P0175": "System Too Rich",
	"P0176": "Fuel Composition Sensor Circuit",
	"P0177": "Fuel Composition Sensor Circuit Range/Performance",
	"P0178": "Fuel Composition Sensor Circuit Low",
	"P0179": "Fuel Composition Sensor Circuit High",
	"P0180": "Fuel Temperature Sensor A Circuit",
	"P0181": "Fuel Temperature Sensor A Circuit Range/Performance",
	"P0182": "Fuel Temperature Sensor A Circuit Low",
	"P0183": "Fuel Temperature Sensor A Circuit High",
	"P0184": "Fuel Temperature Sensor A Circuit Intermittent",
	"P0185": "Fuel Temperature Sensor B Circuit",
	"P0186": "Fuel Temperature Sensor B Circuit Range/Performance",
	"P0187": "Fuel Temperature Sensor B Circuit Low",
	"P0188": "Fuel Temperature Sensor B Circuit High",
	"P0189": "Fuel Temperature Sensor B Circuit Intermittent",
	"P0190": "Fuel Rail Pressure Sensor Circuit",
	"P0191": "Fuel Rail Pressure Sensor Circuit Range/Performance",
	"P0192": "Fuel Rail Pressure Sensor Circuit Low",
	"P0193": "Fuel Rail Pressure Sensor Circuit High",
	"P0194": "Fuel Rail Pressure Sensor Circuit Intermittent",
	"P0195": "Engine Oil Temperature Sensor",
	"P0196": "Engine Oil Temperature Sensor Range/Performance",
	"P0197": "Engine Oil Temperature Sensor Low",
	"P0198": "Engine Oil Temperature Sensor High",
	"P0199": "Engine Oil Temperature Sensor Intermittent",
	"P0200": "Injector Circuit/Open",
	"P0201": "Injector Circuit/Open - Cylinder 1",
	"P0202": "Injector Circuit/Open - Cylinder 2",
	"P0203": "Injector Circuit/Open - Cylinder 3",
	"P0204": "Injector Circuit/Open - Cylinder 4",
	"P0205": "Injector Circuit/Open - Cylinder 5",
	"P0206": "Injector Circuit/Open - Cylinder 6",
	"P0207": "Injector Circuit/Open - Cylinder 7",
	"P0208": "Injector Circuit/Open - Cylinder 8",
	"P0209": "Injector Circuit/Open - Cylinder 9",
	"P0210": "Injector Circuit/Open - Cylinder 10",
	"P0211": "Injector Circuit/Open - Cylinder 11",
	"P0212": "Injector Circuit/Open - Cylinder 12",
	"P0213": "Cold Start Injector 1",
	"P0214": "Cold Start Injector 2",
	"P0215": "Engine Shutoff Solenoid",
	"P0216": "Injector/Injection Timing Control Circuit",
	"P0217": "Engine Coolant Over Temperature Condition",
	"P0218": "Transmission Fluid Over Temperature Condition",
	"P0219": "Engine Overspeed Condition",
	"P0220": "Throttle/Pedal Position Sensor/Switch 'B' Circuit",
	"P0221": "Throttle/Pedal Position Sensor/Switch 'B' Circuit Range/Performance",
	"P0222": "Throttle/Pedal Position Sensor/Switch 'B' Circuit Low",
	"P0223": "Throttle/Pedal Position Sensor/Switch 'B' Circuit High",
	"P0224": "Throttle/Pedal Position Sensor/Switch 'B' Circuit Intermittent",
	"P0225": "Throttle/Pedal Position Sensor/Switch 'C' Circuit",
	"P0226": "Throttle/Pedal Position Sensor/Switch 'C' Circuit Range/Performance",
	"P0227": "Throttle/Pedal Position Sensor/Switch 'C' Circuit Low",
	"P0228": "Throttle/Pedal Position Sensor/Switch 'C' Circuit High",
	"P0229": "Throttle/Pedal Position Sensor/Switch 'C' Circuit Intermittent",
	"P0230": "Fuel Pump Primary Circuit",
	"P0231": "Fuel Pump Secondary Circuit Low",
	"P0232": "Fuel Pump Secondary Circuit High",
	"P0233": "Fuel Pump Secondary Circuit Intermittent",
	"P0234": "Turbo/Super Charger Overboost Condition",
	"P0235": "Turbo/Super Charger Boost Sensor 'A' Circuit",
	"P0236": "Turbo/Super Charger Boost Sensor 'A' Circuit Range/Performance",
	"P0237": "Turbo/Super Charger Boost Sensor 'A' Circuit Low",
	"P0238": "Turbo/Super Charger Boost Sensor 'A' Circuit High",
	"P0239": "Turbo/Super Charger Boost Sensor 'B' Circuit",
	"P0240": "Turbo/Super Charger Boost Sensor 'B' Circuit Range/Performance",
	"P0241": "Turbo/Super Charger Boost Sensor 'B' Circuit Low",
	"P0242": "Turbo/Super Charger Boost Sensor 'B' Circuit High",
	"P0243": "Turbo/Super Charger Wastegate Solenoid 'A'",
	"P0244": "Turbo/Super Charger Wastegate Solenoid 'A' Range/Performance",
	"P0245": "Turbo/Super Charger Wastegate Solenoid 'A' Low",
	"P0246": "Turbo/Super Charger Wastegate Solenoid 'A' High",
	"P0247": "Turbo/Super Charger Wastegate Solenoid 'B'",
	"P0248": "Turbo/Super Charger Wastegate Solenoid 'B' Range/Performance",
	"P0249": "Turbo/Super Charger Wastegate Solenoid 'B' Low",
	"P0250": "Turbo/Super Charger Wastegate Solenoid 'B' High",
	"P0251": "Injection Pump Fuel Metering Control 'A' (Cam/Rotor/Injector)",
	"P0252": "Injection Pump Fuel Metering Control 'A' Range/Performance (Cam/Rotor/Injector)",
	"P0253": "Injection Pump Fuel Metering Control 'A' Low (Cam/Rotor/Injector)",
	"P0254": "Injection Pump Fuel Metering Control 'A' High (Cam/Rotor/Injector)",
	"P0255": "Injection Pump Fuel Metering Control 'A' Intermittent (Cam/Rotor/Injector)",
	"P0256": "Injection Pump Fuel Metering Control 'B' (Cam/Rotor/Injector)",
	"P0257": "Injection Pump Fuel Metering Control 'B' Range/Performance (Cam/Rotor/Injector)",
	"P0258": "Injection Pump Fuel Metering Control 'B' Low (Cam/Rotor/Injector)",
	"P0259": "Injection Pump Fuel Metering Control 'B' High (Cam/Rotor/Injector)",
	"P0260": "Injection Pump Fuel Metering Control 'B' Intermittent (Cam/Rotor/Injector)",
	"P0261": "Cylinder 1 Injector Circuit Low",
	"P0262": "Cylinder 1 Injector Circuit High",
	"P0263": "Cylinder 1 Contribution/Balance",
	"P0264": "Cylinder 2 Injector Circuit Low",
	"P0265": "Cylinder 2 Injector Circuit High",
	"P0266": "Cylinder 2 Contribution/Balance",
	"P0267": "Cylinder 3 Injector Circuit Low",
	"P0268": "Cylinder 3 Injector Circuit High",
	"P0269": "Cylinder 3 Contribution/Balance",
	"P0270": "Cylinder 4 Injector Circuit Low",
	"P0271": "Cylinder 4 Injector Circuit High",
	"P0272": "Cylinder 4 Contribution/Balance",
	"P0273": "Cylinder 5 Injector Circuit Low",
	"P0274": "Cylinder 5 Injector Circuit High",
	"P0275": "Cylinder 5 Contribution/Balance",
	"P0276": "Cylinder 6 Injector Circuit Low",
	"P0277": "Cylinder 6 Injector Circuit High",
	"P0278": "Cylinder 6 Contribution/Balance",
	"P0279": "Cylinder 7 Injector Circuit Low",
	"P0280": "Cylinder 7 Injector Circuit High",
	"P0281": "Cylinder 7 Contribution/Balance",
	"P0282": "Cylinder 8 Injector Circuit Low",
	"P0283": "Cylinder 8 Injector Circuit High",
	"P0284": "Cylinder 8 Contribution/Balance",
	"P0285": "Cylinder 9 Injector Circuit Low",
	"P0286": "Cylinder 9 Injector Circuit High",
	"P0287": "Cylinder 9 Contribution/Balance",
	"P0288": "Cylinder 10 Injector Circuit Low",
	"P0289": "Cylinder 10 Injector Circuit High",
	"P0290": "Cylinder 10 Contribution/Balance",
	"P0291": "Cylinder 11 Injector Circuit Low",
	"P0292": "Cylinder 11 Injector Circuit High",
	"P0293": "Cylinder 11 Contribution/Balance",
	"P0294": "Cylinder 12 Injector Circuit Low",
	"P0295": "Cylinder 12 Injector Circuit High",
	"P0296": "Cylinder 12 Contribution/Balance",
	"P0297": "Vehicle Overspeed Condition",
	"P0298": "Engine Oil Over Temperature",
	"P0299": "Turbo/Super Charger Underboost",
	"P0300": "Random/Multiple Cylinder Misfire Detected",
	"P0301": "Cylinder 1 Misfire Detected",
	"P0302": "Cylinder 2 Misfire Detected",
	"P0303": "Cylinder 3 Misfire Detected",
	"P0304": "Cylinder 4 Misfire Detected",
	"P0305": "Cylinder 5 Misfire Detected",
	"P0306": "Cylinder 6 Misfire Detected",
	"P0307": "Cylinder 7 Misfire Detected",
	"P0308": "Cylinder 8 Misfire Detected",
	"P0309": "Cylinder 9 Misfire Detected",
	"P0310": "Cylinder 10 Misfire Detected",
	"P0311": "Cylinder 11 Misfire Detected",
	"P0312": "Cylinder 12 Misfire Detected",
	"P0313": "Misfire Detected with Low Fuel",
	"P0314": "Single Cylinder Misfire (Cylinder not Specified)",
	"P0315": "Crankshaft Position System Variation Not Learned",
	"P0316": "Engine Misfire Detected on Startup (First 1000 Revolutions)",
	"P0317": "Rough Road Hardware Not Present",
	"P0318": "Rough Road Sensor 'A' Signal Circuit",
	"P0319": "Rough Road Sensor 'B'",
	"P0320": "Ignition/Distributor Engine Speed Input Circuit",
	"P0321": "Ignition/Distributor Engine Speed Input Circuit Range/Performance",
	"P0322": "Ignition/Distributor Engine Speed Input Circuit No Signal",
	"P0323": "Ignition/Distributor Engine Speed Input Circuit Intermittent",
	"P0324": "Knock Control System Error",
	"P0325": "Knock Sensor 1 Circuit",
	"P0326": "Knock Sensor 1 Circuit Range/Performance",
	"P0327": "Knock Sensor 1 Circuit Low",
	"P0328": "Knock Sensor 1 Circuit High",
	"P0329": "Knock Sensor 1 Circuit Input Intermittent",
	"P0330": "Knock Sensor 2 Circuit",
	"P0331": "Knock Sensor 2 Circuit Range/Performance",
	"P0332": "Knock Sensor 2 Circuit Low",
	"P0333": "Knock Sensor 2 Circuit High",
	"P0334": "Knock Sensor 2 Circuit Input Intermittent",
	"P0335": "Crankshaft Position Sensor 'A' Circuit",
	"P0336": "Crankshaft Position Sensor 'A' Circuit Range/Performance",
	"P0337": "Crankshaft Position Sensor 'A' Circuit Low",
	"P0338": "Crankshaft Position Sensor 'A' Circuit High",
	"P0339": "Crankshaft Position Sensor 'A' Circuit Intermittent",
	"P0340": "Camshaft Position Sensor 'A' Circuit",
	"P0341": "Camshaft Position Sensor 'A' Circuit Range/Performance",
	"P0342": "Camshaft Position Sensor 'A' Circuit Low",
	"P0343": "Camshaft Position Sensor 'A' Circuit High",
	"P0344": "Camshaft Position Sensor 'A' Circuit Intermittent",
	"P0345": "Camshaft Position Sensor 'A' Circuit",
	"P0346": "Camshaft Position Sensor 'A' Circuit Range/Performance",
	"P0347": "Camshaft Position Sensor 'A' Circuit Low",
	"P0348": "Camshaft Position Sensor 'A' Circuit High",
	"P0349": "Camshaft Position Sensor 'A' Circuit Intermittent",
	"P0350": "Ignition Coil Primary/Secondary Circuit",
	"P0351": "Ignition Coil 'A' Primary/Secondary Circuit",
	"P0352": "Ignition Coil 'B' Primary/Secondary Circuit",
	"P0353": "Ignition Coil 'C' Primary/Secondary Circuit",
	"P0354": "Ignition Coil 'D' Primary/Secondary Circuit",
	"P0355": "Ignition Coil 'E' Primary/Secondary Circuit",
	"P0356": "Ignition Coil 'F' Primary/Secondary Circuit",
	"P0357": "Ignition Coil 'G' Primary/Secondary Circuit",
	"P0358": "Ignition Coil 'H' Primary/Secondary Circuit",
	"P0359": "Ignition Coil 'I' Primary/Secondary Circuit",
	"P0360": "Ignition Coil 'J' Primary/Secondary Circuit",
	"P0361": "Ignition Coil 'K' Primary/Secondary Circuit",
	"P0362": "Ignition Coil 'L' Primary/Secondary Circuit",
	"P0363": "Misfire Detected - Fueling Disabled",
	"P0364": "Reserved",
	"P0365": "Camshaft Position Sensor 'B' Circuit",
	"P0366": "Camshaft Position Sensor 'B' Circuit Range/Performance",
	"P0367": "Camshaft Position Sensor 'B' Circuit Low",
	"P0368": "Camshaft Position Sensor 'B' Circuit High",
	"P0369": "Camshaft Position Sensor 'B' Circuit Intermittent",
	"P0370": "Timing Reference High Resolution Signal 'A'",
	"P0371": "Timing Reference High Resolution Signal 'A' Too Many Pulses",
	"P0372": "Timing Reference High Resolution Signal 'A' Too Few Pulses",
	"P0373": "Timing Reference High Resolution Signal 'A' Intermittent/Erratic Pulses",
	"P0374": "Timing Reference High Resolution Signal 'A' No Pulse",
	"P0375": "Timing Reference High Resolution Signal 'B'",
	"P0376": "Timing Reference High Resolution Signal 'B' Too Many Pulses",
	"P0377": "Timing Reference High Resolution Signal 'B' Too Few Pulses",
	"P0378": "Timing Reference High Resolution Signal 'B' Intermittent/Erratic Pulses",
	"P0379": "Timing Reference High Resolution Signal 'B' No Pulses",
	"P0380": "Glow Plug/Heater Circuit 'A'",
	"P0381": "Glow Plug/Heater Indicator Circuit",
	"P0382": "Glow Plug/Heater Circuit 'B'",
	"P0383": "Reserved by SAE J2012",
	"P0384": "Reserved by SAE J2012",
	"P0385": "Crankshaft Position Sensor 'B' Circuit",
	"P0386": "Crankshaft Position Sensor 'B' Circuit Range/Performance",
	"P0387": "Crankshaft Position Sensor 'B' Circuit Low",
	"P0388": "Crankshaft Position Sensor 'B' Circuit High",
	"P0389": "Crankshaft Position Sensor 'B' Circuit Intermittent",
	"P0390": "Camshaft Position Sensor 'B' Circuit",
	"P0391": "Camshaft Position Sensor 'B' Circuit Range/Performance",
	"P0392": "Camshaft Position Sensor 'B' Circuit Low",
	"P0393": "Camshaft Position Sensor 'B' Circuit High",
	"P0394": "Camshaft Position Sensor 'B' Circuit Intermittent",
	"P0400": "Exhaust Gas Recirculation Flow",
	"P0401": "Exhaust Gas Recirculation Flow Insufficient Detected",
	"P0402": "Exhaust Gas Recirculation Flow Excessive Detected",
	"P0403": "Exhaust Gas Recirculation Control Circuit",
	"P0404": "Exhaust Gas Recirculation Control Circuit Range/Performance",
	"P0405": "Exhaust Gas Recirculation Sensor 'A' Circuit Low",
	"P0406": "Exhaust Gas Recirculation Sensor 'A' Circuit High",
	"P0407": "Exhaust Gas Recirculation Sensor 'B' Circuit Low",
	"P0408": "Exhaust Gas Recirculation Sensor 'B' Circuit High",
	"P0409": "Exhaust Gas Recirculation Sensor 'A' Circuit",
	"P0410": "Secondary Air Injection System",
	"P0411": "Secondary Air Injection System Incorrect Flow Detected",
	"P0412": "Secondary Air Injection System Switching Valve 'A' Circuit",
	"P0413": "Secondary Air Injection System Switching Valve 'A' Circuit Open",
	"P0414": "Secondary Air Injection System Switching Valve 'A' Circuit Shorted",
	"P0415": "Secondary Air Injection System Switching Valve 'B' Circuit",
	"P0416": "Secondary Air Injection System Switching Valve 'B' Circuit Open",
	"P0417": "Secondary Air Injection System Switching Valve 'B' Circuit Shorted",
	"P0418": "Secondary Air Injection System Control 'A' Circuit",
	"P0419": "Secondary Air Injection System Control 'B' Circuit",
	"P0420": "Catalyst System Efficiency Below Threshold",
	"P0421": "Warm Up Catalyst Efficiency Below Threshold",
	"P0422": "Main Catalyst Efficiency Below Threshold",
	"P0423": "Heated Catalyst Efficiency Below Threshold",
	"P0424": "Heated Catalyst Temperature Below Threshold",
	"P0425": "Catalyst Temperature Sensor",
	"P0426": "Catalyst Temperature Sensor Range/Performance",
	"P0427": "Catalyst Temperature Sensor Low",
	"P0428": "Catalyst Temperature Sensor High",
	"P0429": "Catalyst Heater Control Circuit",
	"P0430": "Catalyst System Efficiency Below Threshold",
	"P0431": "Warm Up Catalyst Efficiency Below Threshold",
	"P0432": "Main Catalyst Efficiency Below Threshold",
	"P0433": "Heated Catalyst Efficiency Below Threshold",
	"P0434": "Heated Catalyst Temperature Below Threshold",
	"P0435": "Catalyst Temperature Sensor",
	"P0436": "Catalyst Temperature Sensor Range/Performance",
	"P0437": "Catalyst Temperature Sensor Low",
	"P0438": "Catalyst Temperature Sensor High",
	"P0439": "Catalyst Heater Control Circuit",
	"P0440": "Evaporative Emission System",
	"P0441": "Evaporative Emission System Incorrect Purge Flow",
	"P0442": "Evaporative Emission System Leak Detected (small leak)",
	"P0443": "Evaporative Emission System Purge Control Valve Circuit",
	"P0444": "Evaporative Emission System Purge Control Valve Circuit Open",
	"P0445": "Evaporative Emission System Purge Control Valve Circuit Shorted",
	"P0446": "Evaporative Emission System Vent Control Circuit",
	"P0447": "Evaporative Emission System Vent Control Circuit Open",
	"P0448": "Evaporative Emission System Vent Control Circuit Shorted",
	"P0449": "Evaporative Emission System Vent Valve/Solenoid Circuit",
	"P0450": "Evaporative Emission System Pressure Sensor/Switch",
	"P0451": "Evaporative Emission System Pressure Sensor/Switch Range/Performance",
	"P0452": "Evaporative Emission System Pressure Sensor/Switch Low",
	"P0453": "Evaporative Emission System Pressure Sensor/Switch High",
	"P0454": "Evaporative Emission System Pressure Sensor/Switch Intermittent",
	"P0455": "Evaporative Emission System Leak Detected (large leak)",
	"P0456": "Evaporative Emission System Leak Detected (very small leak)",
	"P0457": "Evaporative Emission System Leak Detected (fuel cap loose/off)",
	"P0458": "Evaporative Emission System Purge Control Valve Circuit Low",
	"P0459": "Evaporative Emission System Purge Control Valve Circuit High",
	"P0460": "Fuel Level Sensor 'A' Circuit",
	"P0461": "Fuel Level Sensor 'A' Circuit Range/Performance",
	"P0462": "Fuel Level Sensor 'A' Circuit Low",
	"P0463": "Fuel Level Sensor 'A' Circuit High",
	"P0464": "Fuel Level Sensor 'A' Circuit Intermittent",
	"P0465": "EVAP Purge Flow Sensor Circuit",
	"P0466": "EVAP Purge Flow Sensor Circuit Range/Performance",
	"P0467": "EVAP Purge Flow Sensor Circuit Low",
	"P0468": "EVAP Purge Flow Sensor Circuit High",
	"P0469": "EVAP Purge Flow Sensor Circuit Intermittent",
	"P0470": "Exhaust Pressure Sensor",
	"P0471": "Exhaust Pressure Sensor Range/Performance",
	"P0472": "Exhaust Pressure Sensor Low",
	"P0473": "Exhaust Pressure Sensor High",
	"P0474": "Exhaust Pressure Sensor Intermittent",
	"P0475": "Exhaust Pressure Control Valve",
	"P0476": "Exhaust Pressure Control Valve Range/Performance",
	"P0477": "Exhaust Pressure Control Valve Low",
	"P0478": "Exhaust Pressure Control Valve High",
	"P0479": "Exhaust Pressure Control Valve Intermittent",
	"P0480": "Fan 1 Control Circuit",
	"P0481": "Fan 2 Control Circuit",
	"P0482": "Fan 3 Control Circuit",
	"P0483": "Fan Rationality Check",
	"P0484": "Fan Circuit Over Current",
	"P0485": "Fan Power/Ground Circuit",
	"P0486": "Exhaust Gas Recirculation Sensor 'B' Circuit",
	"P0487": "Exhaust Gas Recirculation Throttle Position Control Circuit",
	"P0488": "Exhaust Gas Recirculation Throttle Position Control Range/Performance",
	"P0489": "Exhaust Gas Recirculation Control Circuit Low",
	"P0490": "Exhaust Gas Recirculation Control Circuit High",
	"P0491": "Secondary Air Injection System Insufficient Flow",
	"P0492": "Secondary Air Injection System Insufficient Flow",
	"P0493": "Fan Overspeed",
	"P0494": "Fan Speed Low",
	"P0495": "Fan Speed High",
	"P0496": "Evaporative Emission System High Purge Flow",
	"P0497": "Evaporative Emission System Low Purge Flow",
	"P0498": "Evaporative Emission System Vent Valve Control Circuit Low",
	"P0499": "Evaporative Emission System Vent Valve Control Circuit High",
	"P0500": "Vehicle Speed Sensor 'A'",
	"P0501": "Vehicle Speed Sensor 'A' Range/Performance",
	"P0502": "Vehicle Speed Sensor 'A' Circuit Low Input",
	"P0503": "Vehicle Speed Sensor 'A' Intermittent/Erratic/High",
	"P0504": "Brake Switch 'A'/'B' Correlation",
	"P0505": "Idle Air Control System",
	"P0506": "Idle Air Control System RPM Lower Than Expected",
	"P0507": "Idle Air Control System RPM Higher Than Expected",
	"P0508": "Idle Air Control System Circuit Low",
	"P0509": "Idle Air Control System Circuit High",
	"P0510": "Closed Throttle Position Switch",
	"P0511": "Idle Air Control Circuit",
	"P0512": "Starter Request Circuit",
	"P0513": "Incorrect Immobilizer Key",
	"P0514": "Battery Temperature Sensor Circuit Range/Performance",
	"P0515": "Battery Temperature Sensor Circuit",
	"P0516": "Battery Temperature Sensor Circuit Low",
	"P0517": "Battery Temperature Sensor Circuit High",
	"P0518": "Idle Air Control Circuit Intermittent",
	"P0519": "Idle Air Control System Performance",
	"P0520": "Engine Oil Pressure Sensor/Switch Circuit",
	"P0521": "Engine Oil Pressure Sensor/Switch Range/Performance",
	"P0522": "Engine Oil Pressure Sensor/Switch Low Voltage",
	"P0523": "Engine Oil Pressure Sensor/Switch High Voltage",
	"P0524": "Engine Oil Pressure Too Low",
	"P0525": "Cruise Control Servo Control Circuit Range/Performance",
	"P0526": "Fan Speed Sensor Circuit",
	"P0527": "Fan Speed Sensor Circuit Range/Performance",
	"P0528": "Fan Speed Sensor Circuit No Signal",
	"P0529": "Fan Speed Sensor Circuit Intermittent",
	"P0530": "A/C Refrigerant Pressure Sensor 'A' Circuit",
	"P0531": "A/C Refrigerant Pressure Sensor 'A' Circuit Range/Performance",
	"P0532": "A/C Refrigerant Pressure Sensor 'A' Circuit Low",
	"P0533": "A/C Refrigerant Pressure Sensor 'A' Circuit High",
	"P0534": "Air Conditioner Refrigerant Charge Loss",
	"P0535": "A/C Evaporator Temperature Sensor Circuit",
	"P0536": "A/C Evaporator Temperature Sensor Circuit Range/Performance",
	"P0537": "A/C Evaporator Temperature Sensor Circuit Low",
	"P0538": "A/C Evaporator Temperature Sensor Circuit High",
	"P0539": "A/C Evaporator Temperature Sensor Circuit Intermittent",
	"P0540": "Intake Air Heater 'A' Circuit",
	"P0541": "Intake Air Heater 'A' Circuit Low",
	"P0542": "Intake Air Heater 'A' Circuit High",
	"P0543": "Intake Air Heater 'A' Circuit Open",
	"P0544": "Exhaust Gas Temperature Sensor Circuit",
	"P0545": "Exhaust Gas Temperature Sensor Circuit Low",
	"P0546": "Exhaust Gas Temperature Sensor Circuit High",
	"P0547": "Exhaust Gas Temperature Sensor Circuit",
	"P0548": "Exhaust Gas Temperature Sensor Circuit Low",
	"P0549": "Exhaust Gas Temperature Sensor Circuit High",
	"P0550": "Power Steering Pressure Sensor/Switch Circuit",
	"P0551": "Power Steering Pressure Sensor/Switch Circuit Range/Performance",
	"P0552": "Power Steering Pressure Sensor/Switch Circuit Low Input",
	"P0553": "Power Steering Pressure Sensor/Switch Circuit High Input",
	"P0554": "Power Steering Pressure Sensor/Switch Circuit Intermittent",
	"P0555": "Brake Booster Pressure Sensor Circuit",
	"P0556": "Brake Booster Pressure Sensor Circuit Range/Performance",
	"P0557": "Brake Booster Pressure Sensor Circuit Low Input",
	"P0558": "Brake Booster Pressure Sensor Circuit High Input",
	"P0559": "Brake Booster Pressure Sensor Circuit Intermittent",
	"P0560": "System Voltage",
	"P0561": "System Voltage Unstable",
	"P0562": "System Voltage Low",
	"P0563": "System Voltage High",
	"P0564": "Cruise Control Multi-Function Input 'A' Circuit",
	"P0565": "Cruise Control On Signal",
	"P0566": "Cruise Control Off Signal",
	"P0567": "Cruise Control Resume Signal",
	"P0568": "Cruise Control Set Signal",
	"P0569": "Cruise Control Coast Signal",
	"P0570": "Cruise Control Accelerate Signal",
	"P0571": "Brake Switch 'A' Circuit",
	"P0572": "Brake Switch 'A' Circuit Low",
	"P0573": "Brake Switch 'A' Circuit High",
	"P0574": "Cruise Control System - Vehicle Speed Too High",
	"P0575": "Cruise Control Input Circuit",
	"P0576": "Cruise Control Input Circuit Low",
	"P0577": "Cruise Control Input Circuit High",
	"P0578": "Cruise Control Multi-Function Input 'A' Circuit Stuck",
	"P0579": "Cruise Control Multi-Function Input 'A' Circuit Range/Performance",
	"P0580": "Cruise Control Multi-Function Input 'A' Circuit Low",
	"P0581": "Cruise Control Multi-Function Input 'A' Circuit High",
	"P0582": "Cruise Control Vacuum Control Circuit/Open",
	"P0583": "Cruise Control Vacuum Control Circuit Low",
	"P0584": "Cruise Control Vacuum Control Circuit High",
	"P0585": "Cruise Control Multi-Function Input 'A'/'B' Correlation",
	"P0586": "Cruise Control Vent Control Circuit/Open",
	"P0587": "Cruise Control Vent Control Circuit Low",
	"P0588": "Cruise Control Vent Control Circuit High",
	"P0589": "Cruise Control Multi-Function Input 'B' Circuit",
	"P0590": "Cruise Control Multi-Function Input 'B' Circuit Stuck",
	"P0591": "Cruise Control Multi-Function Input 'B' Circuit Range/Performance",
	"P0592": "Cruise Control Multi-Function Input 'B' Circuit Low",
	"P0593": "Cruise Control Multi-Function Input 'B' Circuit High",
	"P0594": "Cruise Control Servo Control Circuit/Open",
	"P0595": "Cruise Control Servo Control Circuit Low",
	"P0596": "Cruise Control Servo Control Circuit High",
	"P0597": "Thermostat Heater Control Circuit/Open",
	"P0598": "Thermostat Heater Control Circuit Low",
	"P0599": "Thermostat Heater Control Circuit High",
	"P0600": "Serial Communication Link",
	"P0601": "Internal Control Module Memory Check Sum Error",
	"P0602": "Control Module Programming Error",
	"P0603": "Internal Control Module Keep Alive Memory (KAM) Error",
	"P0604": "Internal Control Module Random Access Memory (RAM) Error",
	"P0605": "Internal Control Module Read Only Memory (ROM) Error",
	"P0606": "ECM/PCM Processor",
	"P0607": "Control Module Performance",
	"P0608": "Control Module VSS Output 'A'",
	"P0609": "Control Module VSS Output 'B'",
	"P0610": "Control Module Vehicle Options Error",
	"P0611": "Fuel Injector Control Module Performance",
	"P0612": "Fuel Injector Control Module Relay Control",
	"P0613": "TCM Processor",
	"P0614": "ECM / TCM Incompatible",
	"P0615": "Starter Relay Circuit",
	"P0616": "Starter Relay Circuit Low",
	"P0617": "Starter Relay Circuit High",
	"P0618": "Alternative Fuel Control Module KAM Error",
	"P0619": "Alternative Fuel Control Module RAM/ROM Error",
	"P0620": "Generator Control Circuit",
	"P0621": "Generator Lamp/L Terminal Circuit",
	"P0622": "Generator Field/F Terminal Circuit",
	"P0623": "Generator Lamp Control Circuit",
	"P0624": "Fuel Cap Lamp Control Circuit",
	"P0625": "Generator Field/F Terminal Circuit Low",
	"P0626": "Generator Field/F Terminal Circuit High",
	"P0627": "Fuel Pump 'A' Control Circuit /Open",
	"P0628": "Fuel Pump 'A' Control Circuit Low",
	"P0629": "Fuel Pump 'A' Control Circuit High",
	"P0630": "VIN Not Programmed or Incompatible - ECM/PCM",
	"P0631": "VIN Not Programmed or Incompatible - TCM",
	"P0632": "Odometer Not Programmed - ECM/PCM",
	"P0633": "Immobilizer Key Not Programmed - ECM/PCM",
	"P0634": "PCM/ECM/TCM Internal Temperature Too High",
	"P0635": "Power Steering Control Circuit",
	"P0636": "Power Steering Control Circuit Low",
	"P0637": "Power Steering Control Circuit High",
	"P0638": "Throttle Actuator Control Range/Performance",
	"P0639": "Throttle Actuator Control Range/Performance",
	"P0640": "Intake Air Heater Control Circuit",
	"P0641": "Sensor Reference Voltage 'A' Circuit/Open",
	"P0642": "Sensor Reference Voltage 'A' Circuit Low",
	"P0643": "Sensor Reference Voltage 'A' Circuit High",
	"P0644": "Driver Display Serial Communication Circuit",
	"P0645": "A/C Clutch Relay Control Circuit",
	"P0646": "A/C Clutch Relay Control Circuit Low",
	"P0647": "A/C Clutch Relay Control Circuit High",
	"P0648": "Immobilizer Lamp Control Circuit",
	"P0649": "Speed Control Lamp Control Circuit",
	"P0650": "Malfunction Indicator Lamp (MIL) Control Circuit",
	"P0651": "Sensor Reference Voltage 'B' Circuit/Open",
	"P0652": "Sensor Reference Voltage 'B' Circuit Low",
	"P0653": "Sensor Reference Voltage 'B' Circuit High",
	"P0654": "Engine RPM Output Circuit",
	"P0655": "Engine Hot Lamp Output Control Circuit",
	"P0656": "Fuel Level Output Circuit",
	"P0657": "Actuator Supply Voltage 'A' Circuit/Open",
	"P0658": "Actuator Supply Voltage 'A' Circuit Low",
	"P0659": "Actuator Supply Voltage 'A' Circuit High",
	"P0660": "Intake Manifold Tuning Valve Control Circuit/Open",
	"P0661": "Intake Manifold Tuning Valve Control Circuit Low",
	"P0662": "Intake Manifold Tuning Valve Control Circuit High",
	"P0663": "Intake Manifold Tuning Valve Control Circuit/Open",
	"P0664": "Intake Manifold Tuning Valve Control Circuit Low",
	"P0665": "Intake Manifold Tuning Valve Control Circuit High",
	"P0666": "PCM/ECM/TCM Internal Temperature Sensor Circuit",
	"P0667": "PCM/ECM/TCM Internal Temperature Sensor Range/Performance",
	"P0668": "PCM/ECM/TCM Internal Temperature Sensor Circuit Low",
	"P0669": "PCM/ECM/TCM Internal Temperature Sensor Circuit High",
	"P0670": "Glow Plug Module Control Circuit",
	"P0671": "Cylinder 1 Glow Plug Circuit",
	"P0672": "Cylinder 2 Glow Plug Circuit",
	"P0673": "Cylinder 3 Glow Plug Circuit",
	"P0674": "Cylinder 4 Glow Plug Circuit",
	"P0675": "Cylinder 5 Glow Plug Circuit",
	"P0676": "Cylinder 6 Glow Plug Circuit",
	"P0677": "Cylinder 7 Glow Plug Circuit",
	"P0678": "Cylinder 8 Glow Plug Circuit",
	"P0679": "Cylinder 9 Glow Plug Circuit",
	"P0680": "Cylinder 10 Glow Plug Circuit",
	"P0681": "Cylinder 11 Glow Plug Circuit",
	"P0682": "Cylinder 12 Glow Plug Circuit",
	"P0683": "Glow Plug Control Module to PCM Communication Circuit",
	"P0684": "Glow Plug Control Module to PCM Communication Circuit Range/Performance",
	"P0685": "ECM/PCM Power Relay Control Circuit /Open",
	"P0686": "ECM/PCM Power Relay Control Circuit Low",
	"P0687": "ECM/PCM Power Relay Control Circuit High",
	"P0688": "ECM/PCM Power Relay Sense Circuit /Open",
	"P0689": "ECM/PCM Power Relay Sense Circuit Low",
	"P0690": "ECM/PCM Power Relay Sense Circuit High",
	"P0691": "Fan 1 Control Circuit Low",
	"P0692": "Fan 1 Control Circuit High",
	"P0693": "Fan 2 Control Circuit Low",
	"P0694": "Fan 2 Control Circuit High",
	"P0695": "Fan 3 Control Circuit Low",
	"P0696": "Fan 3 Control Circuit High",
	"P0697": "Sensor Reference Voltage 'C' Circuit/Open",
	"P0698": "Sensor Reference Voltage 'C' Circuit Low",
	"P0699": "Sensor Reference Voltage 'C' Circuit High",
	"P0700": "Transmission Control System (MIL Request)",
	"P0701": "Transmission Control System Range/Performance",
	"P0702": "Transmission Control System Electrical",
	"P0703": "Brake Switch 'B' Circuit",
	"P0704": "Clutch Switch Input Circuit Malfunction",
	"P0705": "Transmission Range Sensor Circuit Malfunction (PRNDL Input)",
	"P0706": "Transmission Range Sensor Circuit Range/Performance",
	"P0707": "Transmission Range Sensor Circuit Low",
	"P0708": "Transmission Range Sensor Circuit High",
	"P0709": "Transmission Range Sensor Circuit Intermittent",
	"P0710": "Transmission Fluid Temperature Sensor 'A' Circuit",
	"P0711": "Transmission Fluid Temperature Sensor 'A' Circuit Range/Performance",
	"P0712": "Transmission Fluid Temperature Sensor 'A' Circuit Low",
	"P0713": "Transmission Fluid Temperature Sensor 'A' Circuit High",
	"P0714": "Transmission Fluid Temperature Sensor 'A' Circuit Intermittent",
	"P0715": "Input/Turbine Speed Sensor 'A' Circuit",
	"P0716": "Input/Turbine Speed Sensor 'A' Circuit Range/Performance",
	"P0717": "Input/Turbine Speed Sensor 'A' Circuit No Signal",
	"P0718": "Input/Turbine Speed Sensor 'A' Circuit Intermittent",
	"P0719": "Brake Switch 'B' Circuit Low",
	"P0720": "Output Speed Sensor Circuit",
	"P0721": "Output Speed Sensor Circuit Range/Performance",
	"P0722": "Output Speed Sensor Circuit No Signal",
	"P0723": "Output Speed Sensor Circuit Intermittent",
	"P0724": "Brake Switch 'B' Circuit High",
	"P0725": "Engine Speed Input Circuit",
	"P0726": "Engine Speed Input Circuit Range/Performance",
	"P0727": "Engine Speed Input Circuit No Signal",
	"P0728": "Engine Speed Input Circuit Intermittent",
	"P0729": "Gear 6 Incorrect Ratio",
	"P0730": "Incorrect Gear Ratio",
	"P0731": "Gear 1 Incorrect Ratio",
	"P0732": "Gear 2 Incorrect Ratio",
	"P0733": "Gear 3 Incorrect Ratio",
	"P0734": "Gear 4 Incorrect Ratio",
	"P0735": "Gear 5 Incorrect Ratio",
	"P0736": "Reverse Incorrect Ratio",
	"P0737": "TCM Engine Speed Output Circuit",
	"P0738": "TCM Engine Speed Output Circuit Low",
	"P0739": "TCM Engine Speed Output Circuit High",
	"P0740": "Torque Converter Clutch Circuit/Open",
	"P0741": "Torque Converter Clutch Circuit Performance or Stuck Off",
	"P0742": "Torque Converter Clutch Circuit Stuck On",
	"P0743": "Torque Converter Clutch Circuit Electrical",
	"P0744": "Torque Converter Clutch Circuit Intermittent",
	"P0745": "Pressure Control Solenoid 'A'",
	"P0746": "Pressure Control Solenoid 'A' Performance or Stuck Off",
	"P0747": "Pressure Control Solenoid 'A' Stuck On",
	"P0748": "Pressure Control Solenoid 'A' Electrical",
	"P0749": "Pressure Control Solenoid 'A' Intermittent",
	"P0750": "Shift Solenoid 'A'",
	"P0751": "Shift Solenoid 'A' Performance or Stuck Off",
	"P0752": "Shift Solenoid 'A' Stuck On",
	"P0753": "Shift Solenoid 'A' Electrical",
	"P0754": "Shift Solenoid 'A' Intermittent",
	"P0755": "Shift Solenoid 'B'",
	"P0756": "Shift Solenoid 'B' Performance or Stuck Off",
	"P0757": "Shift Solenoid 'B' Stuck On",
	"P0758": "Shift Solenoid 'B' Electrical",
	"P0759": "Shift Solenoid 'B' Intermittent",
	"P0760": "Shift Solenoid 'C'",
	"P0761": "Shift Solenoid 'C' Performance or Stuck Off",
	"P0762": "Shift Solenoid 'C' Stuck On",
	"P0763": "Shift Solenoid 'C' Electrical",
	"P0764": "Shift Solenoid 'C' Intermittent",
	"P0765": "Shift Solenoid 'D'",
	"P0766": "Shift Solenoid 'D' Performance or Stuck Off",
	"P0767": "Shift Solenoid 'D' Stuck On",
	"P0768": "Shift Solenoid 'D' Electrical",
	"P0769": "Shift Solenoid 'D' Intermittent",
	"P0770": "Shift Solenoid 'E'",
	"P0771": "Shift Solenoid 'E' Performance or Stuck Off",
	"P0772": "Shift Solenoid 'E' Stuck On",
	"P0773": "Shift Solenoid 'E' Electrical",
	"P0774": "Shift Solenoid 'E' Intermittent",
	"P0775": "Pressure Control Solenoid 'B'",
	"P0776": "Pressure Control Solenoid 'B' Performance or Stuck off",
	"P0777": "Pressure Control Solenoid 'B' Stuck On",
	"P0778": "Pressure Control Solenoid 'B' Electrical",
	"P0779": "Pressure Control Solenoid 'B' Intermittent",
	"P0780": "Shift Error",
	"P0781": "1-2 Shift",
	"P0782": "2-3 Shift",
	"P0783": "3-4 Shift",
	"P0784": "4-5 Shift",
	"P0785": "Shift/Timing Solenoid",
	"P0786": "Shift/Timing Solenoid Range/Performance",
	"P0787": "Shift/Timing Solenoid Low",
	"P0788": "Shift/Timing Solenoid High",
	"P0789": "Shift/Timing Solenoid Intermittent",
	"P0790": "Normal/Performance Switch Circuit",
	"P0791": "Intermediate Shaft Speed Sensor 'A' Circuit",
	"P0792": "Intermediate Shaft Speed Sensor 'A' Circuit Range/Performance",
	"P0793": "Intermediate Shaft Speed Sensor 'A' Circuit No Signal",
	"P0794": "Intermediate Shaft Speed Sensor 'A' Circuit Intermittent",
	"P0795": "Pressure Control Solenoid 'C'",
	"P0796": "Pressure Control Solenoid 'C' Performance or Stuck off",
	"P0797": "Pressure Control Solenoid 'C' Stuck On",
	"P0798": "Pressure Control Solenoid 'C' Electrical",
	"P0799": "Pressure Control Solenoid 'C' Intermittent",
	"P0800": "Transfer Case Control System (MIL Request)",
	"P0801": "Reverse Inhibit Control Circuit",
	"P0802": "Transmission Control System MIL Request Circuit/Open",
	"P0803": "1-4 Upshift (Skip Shift) Solenoid Control Circuit",
	"P0804": "1-4 Upshift (Skip Shift) Lamp Control Circuit",
	"P0805": "Clutch Position Sensor Circuit",
	"P0806": "Clutch Position Sensor Circuit Range/Performance",
	"P0807": "Clutch Position Sensor Circuit Low",
	"P0808": "Clutch Position Sensor Circuit High",
	"P0809": "Clutch Position Sensor Circuit Intermittent",
	"P0810": "Clutch Position Control Error",
	"P0811": "Excessive Clutch Slippage",
	"P0812": "Reverse Input Circuit",
	"P0813": "Reverse Output Circuit",
	"P0814": "Transmission Range Display Circuit",
	"P0815": "Upshift Switch Circuit",
	"P0816": "Downshift Switch Circuit",
	"P0817": "Starter Disable Circuit",
	"P0818": "Driveline Disconnect Switch Input Circuit",
	"P0819": "Up and Down Shift Switch to Transmission Range Correlation",
	"P0820": "Gear Lever X-Y Position Sensor Circuit",
	"P0821": "Gear Lever X Position Circuit",
	"P0822": "Gear Lever Y Position Circuit",
	"P0823": "Gear Lever X Position Circuit Intermittent",
	"P0824": "Gear Lever Y Position Circuit Intermittent",
	"P0825": "Gear Lever Push-Pull Switch (Shift Anticipate)",
	"P0826": "Up and Down Shift Switch Circuit",
	"P0827": "Up and Down Shift Switch Circuit Low",
	"P0828": "Up and Down Shift Switch Circuit High",
	"P0829": "5-6 Shift",
	"P0830": "Clutch Pedal Switch 'A' Circuit",
	"P0831": "Clutch Pedal Switch 'A' Circuit Low",
	"P0832": "Clutch Pedal Switch 'A' Circuit High",
	"P0833": "Clutch Pedal Switch 'B' Circuit",
	"P0834": "Clutch Pedal Switch 'B' Circuit Low",
	"P0835": "Clutch Pedal Switch 'B' Circuit High",
	"P0836": "Four Wheel Drive (4WD) Switch Circuit",
	"P0837": "Four Wheel Drive (4WD) Switch Circuit Range/Performance",
	"P0838": "Four Wheel Drive (4WD) Switch Circuit Low",
	"P0839": "Four Wheel Drive (4WD) Switch Circuit High",
	"P0840": "Transmission Fluid Pressure Sensor/Switch 'A' Circuit",
	"P0841": "Transmission Fluid Pressure Sensor/Switch 'A' Circuit Range/Performance",
	"P0842": "Transmission Fluid Pressure Sensor/Switch 'A' Circuit Low",
	"P0843": "Transmission Fluid Pressure Sensor/Switch 'A' Circuit High",
	"P0844": "Transmission Fluid Pressure Sensor/Switch 'A' Circuit Intermittent",
	"P0845": "Transmission Fluid Pressure Sensor/Switch 'B' Circuit",
	"P0846": "Transmission Fluid Pressure Sensor/Switch 'B' Circuit Range/Performance",
	"P0847": "Transmission Fluid Pressure Sensor/Switch 'B' Circuit Low",
	"P0848": "Transmission Fluid Pressure Sensor/Switch 'B' Circuit High",
	"P0849": "Transmission Fluid Pressure Sensor/Switch 'B' Circuit Intermittent",
	"P0850": "Park/Neutral Switch Input Circuit",
	"P0851": "Park/Neutral Switch Input Circuit Low",
	"P0852": "Park/Neutral Switch Input Circuit High",
	"P0853": "Drive Switch Input Circuit",
	"P0854": "Drive Switch Input Circuit Low",
	"P0855": "Drive Switch Input Circuit High",
	"P0856": "Traction Control Input Signal",
	"P0857": "Traction Control Input Signal Range/Performance",
	"P0858": "Traction Control Input Signal Low",
	"P0859": "Traction Control Input Signal High",
	"P0860": "Gear Shift Module Communication Circuit",
	"P0861": "Gear Shift Module Communication Circuit Low",
	"P0862": "Gear Shift Module Communication Circuit High",
	"P0863": "TCM Communication Circuit",
	"P0864": "TCM Communication Circuit Range/Performance",
	"P0865": "TCM Communication Circuit Low",
	"P0866": "TCM Communication Circuit High",
	"P0867": "Transmission Fluid Pressure",
	"P0868": "Transmission Fluid Pressure Low",
	"P0869": "Transmission Fluid Pressure High",
	"P0870": "Transmission Fluid Pressure Sensor/Switch 'C' Circuit",
	"P0871": "Transmission Fluid Pressure Sensor/Switch 'C' Circuit Range/Performance",
	"P0872": "Transmission Fluid Pressure Sensor/Switch 'C' Circuit Low",
	"P0873": "Transmission Fluid Pressure Sensor/Switch 'C' Circuit High",
	"P0874": "Transmission Fluid Pressure Sensor/Switch 'C' Circuit Intermittent",
	"P0875": "Transmission Fluid Pressure Sensor/Switch 'D' Circuit",
	"P0876": "Transmission Fluid Pressure Sensor/Switch 'D' Circuit Range/Performance",
	"P0877": "Transmission Fluid Pressure Sensor/Switch 'D' Circuit Low",
	"P0878": "Transmission Fluid Pressure Sensor/Switch 'D' Circuit High",
	"P0879": "Transmission Fluid Pressure Sensor/Switch 'D' Circuit Intermittent",
	"P0880": "TCM Power Input Signal",
	"P0881": "TCM Power Input Signal Range/Performance",
	"P0882": "TCM Power Input Signal Low",
	"P0883": "TCM Power Input Signal High",
	"P0884": "TCM Power Input Signal Intermittent",
	"P0885": "TCM Power Relay Control Circuit/Open",
	"P0886": "TCM Power Relay Control Circuit Low",
	"P0887": "TCM Power Relay Control Circuit High",
	"P0888": "TCM Power Relay Sense Circuit",
	"P0889": "TCM Power Relay Sense Circuit Range/Performance",
	"P0890": "TCM Power Relay Sense Circuit Low",
	"P0891": "TCM Power Relay Sense Circuit High",
	"P0892": "TCM Power Relay Sense Circuit Intermittent",
	"P0893": "Multiple Gears Engaged",
	"P0894": "Transmission Component Slipping",
	"P0895": "Shift Time Too Short",
	"P0896": "Shift Time Too Long",
	"P0897": "Transmission Fluid Deteriorated",
	"P0898": "Transmission Control System MIL Request Circuit Low",
	"P0899": "Transmission Control System MIL Request Circuit High",
	"P0900": "Clutch Actuator Circuit/Open",
	"P0901": "Clutch Actuator Circuit Range/Performance",
	"P0902": "Clutch Actuator Circuit Low",
	"P0903": "Clutch Actuator Circuit High",
	"P0904": "Gate Select Position Circuit",
	"P0905": "Gate Select Position Circuit Range/Performance",
	"P0906": "Gate Select Position Circuit Low",
	"P0907": "Gate Select Position Circuit High",
	"P0908": "Gate Select Position Circuit Intermittent",
	"P0909": "Gate Select Control Error",
	"P0910": "Gate Select Actuator Circuit/Open",
	"P0911": "Gate Select Actuator Circuit Range/Performance",
	"P0912": "Gate Select Actuator Circuit Low",
	"P0913": "Gate Select Actuator Circuit High",
	"P0914": "Gear Shift Position Circuit",
	"P0915": "Gear Shift Position Circuit Range/Performance",
	"P0916": "Gear Shift Position Circuit Low",
	"P0917": "Gear Shift Position Circuit High",
	"P0918": "Gear Shift Position Circuit Intermittent",
	"P0919": "Gear Shift Position Control Error",
	"P0920": "Gear Shift Forward Actuator Circuit/Open",
	"P0921": "Gear Shift Forward Actuator Circuit Range/Performance",
	"P0922": "Gear Shift Forward Actuator Circuit Low",
	"P0923": "Gear Shift Forward Actuator Circuit High",
	"P0924": "Gear Shift Reverse Actuator Circuit/Open",
	"P0925": "Gear Shift Reverse Actuator Circuit Range/Performance",
	"P0926": "Gear Shift Reverse Actuator Circuit Low",
	"P0927": "Gear Shift Reverse Actuator Circuit High",
	"P0928": "Gear Shift Lock Solenoid Control Circuit/Open",
	"P0929": "Gear Shift Lock Solenoid Control Circuit Range/Performance",
	"P0930": "Gear Shift Lock Solenoid Control Circuit Low",
	"P0931": "Gear Shift Lock Solenoid Control Circuit High",
	"P0932": "Hydraulic Pressure Sensor Circuit",
	"P0933": "Hydraulic Pressure Sensor Range/Performance",
	"P0934": "Hydraulic Pressure Sensor Circuit Low",
	"P0935": "Hydraulic Pressure Sensor Circuit High",
	"P0936": "Hydraulic Pressure Sensor Circuit Intermittent",
	"P0937": "Hydraulic Oil Temperature Sensor Circuit",
	"P0938": "Hydraulic Oil Temperature Sensor Range/Performance",
	"P0939": "Hydraulic Oil Temperature Sensor Circuit Low",
	"P0940": "Hydraulic Oil Temperature Sensor Circuit High",
	"P0941": "Hydraulic Oil Temperature Sensor Circuit Intermittent",
	"P0942": "Hydraulic Pressure Unit",
	"P0943": "Hydraulic Pressure Unit Cycling Period Too Short",
	"P0944": "Hydraulic Pressure Unit Loss of Pressure",
	"P0945": "Hydraulic Pump Relay Circuit/Open",
	"P0946": "Hydraulic Pump Relay Circuit Range/Performance",
	"P0947": "Hydraulic Pump Relay Circuit Low",
	"P0948": "Hydraulic Pump Relay Circuit High",
	"P0949": "Auto Shift Manual Adaptive Learning Not Complete",
	"P0950": "Auto Shift Manual Control Circuit",
	"P0951": "Auto Shift Manual Control Circuit Range/Performance",
	"P0952": "Auto Shift Manual Control Circuit Low",
	"P0953": "Auto Shift Manual Control Circuit High",
	"P0954": "Auto Shift Manual Control Circuit Intermittent",
	"P0955": "Auto Shift Manual Mode Circuit",
	"P0956": "Auto Shift Manual Mode Circuit Range/Performance",
	"P0957": "Auto Shift Manual Mode Circuit Low",
	"P0958": "Auto Shift Manual Mode Circuit High",
	"P0959": "Auto Shift Manual Mode Circuit Intermittent",
	"P0960": "Pressure Control Solenoid 'A' Control Circuit/Open",
	"P0961": "Pressure Control Solenoid 'A' Control Circuit Range/Performance",
	"P0962": "Pressure Control Solenoid 'A' Control Circuit Low",
	"P0963": "Pressure Control Solenoid 'A' Control Circuit High",
	"P0964": "Pressure Control Solenoid 'B' Control Circuit/Open",
	"P0965": "Pressure Control Solenoid 'B' Control Circuit Range/Performance",
	"P0966": "Pressure Control Solenoid 'B' Control Circuit Low",
	"P0967": "Pressure Control Solenoid 'B' Control Circuit High",
	"P0968": "Pressure Control Solenoid 'C' Control Circuit/Open",
	"P0969": "Pressure Control Solenoid 'C' Control Circuit Range/Performance",
	"P0970": "Pressure Control Solenoid 'C' Control Circuit Low",
	"P0971": "Pressure Control Solenoid 'C' Control Circuit High",
	"P0972": "Shift Solenoid 'A' Control Circuit Range/Performance",
	"P0973": "Shift Solenoid 'A' Control Circuit Low",
	"P0974": "Shift Solenoid 'A' Control Circuit High",
	"P0975": "Shift Solenoid 'B' Control Circuit Range/Performance",
	"P0976": "Shift Solenoid 'B' Control Circuit Low",
	"P0977": "Shift Solenoid 'B' Control Circuit High",
	"P0978": "Shift Solenoid 'C' Control Circuit Range/Performance",
	"P0979": "Shift Solenoid 'C' Control Circuit Low",
	"P0980": "Shift Solenoid 'C' Control Circuit High",
	"P0981": "Shift Solenoid 'D' Control Circuit Range/Performance",
...

This file has been truncated, please download it to see its full contents.

OBDII io

Python
The comments in the script make this pretty self-explanatory. I didn't have to modify this code at all. It is utilized by the recording and capture script.
#!/usr/bin/env python
###########################################################################
# odb_io.py
# 
# Copyright 2004 Donour Sizemore (donour@uchicago.edu)
# Copyright 2009 Secons Ltd. (www.obdtester.com)
#
# This file is part of pyOBD.
#
# pyOBD is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# pyOBD is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with pyOBD; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
###########################################################################

import serial
import string
import time
from math import ceil
from datetime import datetime

import obd_sensors

from obd_sensors import hex_to_int

GET_DTC_COMMAND   = "03"
CLEAR_DTC_COMMAND = "04"
GET_FREEZE_DTC_COMMAND = "07"

from debugEvent import debug_display

#__________________________________________________________________________
def decrypt_dtc_code(code):
    """Returns the 5-digit DTC code from hex encoding"""
    dtc = []
    current = code
    for i in range(0,3):
        if len(current)<4:
            raise "Tried to decode bad DTC: %s" % code

        tc = obd_sensors.hex_to_int(current[0]) #typecode
        tc = tc >> 2
        if   tc == 0:
            type = "P"
        elif tc == 1:
            type = "C"
        elif tc == 2:
            type = "B"
        elif tc == 3:
            type = "U"
        else:
            raise tc

        dig1 = str(obd_sensors.hex_to_int(current[0]) & 3)
        dig2 = str(obd_sensors.hex_to_int(current[1]))
        dig3 = str(obd_sensors.hex_to_int(current[2]))
        dig4 = str(obd_sensors.hex_to_int(current[3]))
        dtc.append(type+dig1+dig2+dig3+dig4)
        current = current[4:]
    return dtc
#__________________________________________________________________________

class OBDPort:
     """ OBDPort abstracts all communication with OBD-II device."""
     def __init__(self,portnum,_notify_window,SERTIMEOUT,RECONNATTEMPTS):
         """Initializes port by resetting device and gettings supported PIDs. """
         # These should really be set by the user.
         baud     = 38400
         databits = 8
         par      = serial.PARITY_NONE  # parity
         sb       = 1                   # stop bits
         to       = SERTIMEOUT
         self.ELMver = "Unknown"
         self.State = 1 #state SERIAL is 1 connected, 0 disconnected (connection failed)
         self.port = None
         
         self._notify_window=_notify_window
         debug_display(self._notify_window, 1, "Opening interface (serial port)")

         try:
             self.port = serial.Serial(portnum,baud, \
             parity = par, stopbits = sb, bytesize = databits,timeout = to)
             
         except serial.SerialException as e:
             print e
             self.State = 0
             return None
             
         debug_display(self._notify_window, 1, "Interface successfully " + self.port.portstr + " opened")
         debug_display(self._notify_window, 1, "Connecting to ECU...")
         
         try:
            self.send_command("atz")   # initialize
            time.sleep(1)
         except serial.SerialException:
            self.State = 0
            return None
            
         self.ELMver = self.get_result()
         if(self.ELMver is None):
            self.State = 0
            return None
         
         debug_display(self._notify_window, 2, "atz response:" + self.ELMver)
         self.send_command("ate0")  # echo off
         debug_display(self._notify_window, 2, "ate0 response:" + self.get_result())
         self.send_command("0100")
         ready = self.get_result()
         
         if(ready is None):
            self.State = 0
            return None
            
         debug_display(self._notify_window, 2, "0100 response:" + ready)
         return None
              
     def close(self):
         """ Resets device and closes all associated filehandles"""
         
         if (self.port!= None) and self.State==1:
            self.send_command("atz")
            self.port.close()
         
         self.port = None
         self.ELMver = "Unknown"

     def send_command(self, cmd):
         """Internal use only: not a public interface"""
         if self.port:
             self.port.flushOutput()
             self.port.flushInput()
             for c in cmd:
                 self.port.write(c)
             self.port.write("\r\n")
             #debug_display(self._notify_window, 3, "Send command:" + cmd)

     def interpret_result(self,code):
         """Internal use only: not a public interface"""
         # Code will be the string returned from the device.
         # It should look something like this:
         # '41 11 0 0\r\r'
         
         # 9 seems to be the length of the shortest valid response
         if len(code) < 7:
             #raise Exception("BogusCode")
             print "boguscode?"+code
         
         # get the first thing returned, echo should be off
         code = string.split(code, "\r")
         code = code[0]
         
         #remove whitespace
         code = string.split(code)
         code = string.join(code, "")
         
         #cables can behave differently 
         if code[:6] == "NODATA": # there is no such sensor
             return "NODATA"
             
         # first 4 characters are code from ELM
         code = code[4:]
         return code
    
     def get_result(self):
         """Internal use only: not a public interface"""
         #time.sleep(0.01)
         repeat_count = 0
         if self.port is not None:
             buffer = ""
             while 1:
                 c = self.port.read(1)
                 if len(c) == 0:
                    if(repeat_count == 5):
                        break
                    print "Got nothing\n"
                    repeat_count = repeat_count + 1
                    continue
                    
                 if c == '\r':
                    continue
                    
                 if c == ">":
                    break;
                     
                 if buffer != "" or c != ">": #if something is in buffer, add everything
                    buffer = buffer + c
                    
             #debug_display(self._notify_window, 3, "Get result:" + buffer)
             if(buffer == ""):
                return None
             return buffer
         else:
            debug_display(self._notify_window, 3, "NO self.port!")
         return None

     # get sensor value from command
     def get_sensor_value(self,sensor):
         """Internal use only: not a public interface"""
         cmd = sensor.cmd
         self.send_command(cmd)
         data = self.get_result()
         
         if data:
             data = self.interpret_result(data)
             if data != "NODATA":
                 data = sensor.value(data)
         else:
             return "NORESPONSE"
             
         return data

     # return string of sensor name and value from sensor index
     def sensor(self , sensor_index):
         """Returns 3-tuple of given sensors. 3-tuple consists of
         (Sensor Name (string), Sensor Value (string), Sensor Unit (string) ) """
         sensor = obd_sensors.SENSORS[sensor_index]
         r = self.get_sensor_value(sensor)
         return (sensor.name,r, sensor.unit)

     def sensor_names(self):
         """Internal use only: not a public interface"""
         names = []
         for s in obd_sensors.SENSORS:
             names.append(s.name)
         return names
         
     def get_tests_MIL(self):
         statusText=["Unsupported","Supported - Completed","Unsupported","Supported - Incompleted"]
         
         statusRes = self.sensor(1)[1] #GET values
         statusTrans = [] #translate values to text
         
         statusTrans.append(str(statusRes[0])) #DTCs
         
         if statusRes[1]==0: #MIL
            statusTrans.append("Off")
         else:
            statusTrans.append("On")
            
         for i in range(2,len(statusRes)): #Tests
              statusTrans.append(statusText[statusRes[i]]) 
         
         return statusTrans
          
     #
     # fixme: j1979 specifies that the program should poll until the number
     # of returned DTCs matches the number indicated by a call to PID 01
     #
     def get_dtc(self):
          """Returns a list of all pending DTC codes. Each element consists of
          a 2-tuple: (DTC code (string), Code description (string) )"""
          dtcLetters = ["P", "C", "B", "U"]
          r = self.sensor(1)[1] #data
          dtcNumber = r[0]
          mil = r[1]
          DTCCodes = []
          
          
          print "Number of stored DTC:" + str(dtcNumber) + " MIL: " + str(mil)
          # get all DTC, 3 per mesg response
          for i in range(0, ((dtcNumber+2)/3)):
            self.send_command(GET_DTC_COMMAND)
            res = self.get_result()
            print "DTC result:" + res
            for i in range(0, 3):
                val1 = hex_to_int(res[3+i*6:5+i*6])
                val2 = hex_to_int(res[6+i*6:8+i*6]) #get DTC codes from response (3 DTC each 2 bytes)
                val  = (val1<<8)+val2 #DTC val as int
                
                if val==0: #skip fill of last packet
                  break
                   
                DTCStr=dtcLetters[(val&0xC000)>14]+str((val&0x3000)>>12)+str((val&0x0f00)>>8)+str((val&0x00f0)>>4)+str(val&0x000f)
                
                DTCCodes.append(["Active",DTCStr])
          
          #read mode 7
          self.send_command(GET_FREEZE_DTC_COMMAND)
          res = self.get_result()
          
          if res[:7] == "NO DATA": #no freeze frame
            return DTCCodes
          
          print "DTC freeze result:" + res
          for i in range(0, 3):
              val1 = hex_to_int(res[3+i*6:5+i*6])
              val2 = hex_to_int(res[6+i*6:8+i*6]) #get DTC codes from response (3 DTC each 2 bytes)
              val  = (val1<<8)+val2 #DTC val as int
                
              if val==0: #skip fill of last packet
                break
                   
              DTCStr=dtcLetters[(val&0xC000)>14]+str((val&0x3000)>>12)+str((val&0x0f00)>>8)+str((val&0x00f0)>>4)+str(val&0x000f)
              DTCCodes.append(["Passive",DTCStr])
              
          return DTCCodes
              
     def clear_dtc(self):
         """Clears all DTCs and freeze frame data"""
         self.send_command(CLEAR_DTC_COMMAND)     
         r = self.get_result()
         return r
     
     def log(self, sensor_index, filename): 
          file = open(filename, "w")
          start_time = time.time() 
          if file:
               data = self.sensor(sensor_index)
               file.write("%s     \t%s(%s)\n" % \
                         ("Time", string.strip(data[0]), data[2])) 
               while 1:
                    now = time.time()
                    data = self.sensor(sensor_index)
                    line = "%.6f,\t%s\n" % (now - start_time, data[1])
                    file.write(line)
                    file.flush()
          

Record data

Python
This script uses data from the Sort sensor data script and logs data to a .log file set to a removable USB drive. Gear ratios for the car are put into the script, and are then shown in the terminal while driving. I chose to log the time, engine rpm, speed, short and long term fuel trims from bank 1, throttle angle, and the gear ratio. Any of the sensors from the "Sort sensor data" script can be logged by defining the sensor on line 90
#!/usr/bin/env python

import obd_io
import serial
import platform
import obd_sensors
from datetime import datetime
import time

from obd_utils import scanSerial

class OBD_Recorder():
    def __init__(self, path, log_items):
        self.port = None
        self.sensorlist = []
        localtime = time.localtime(time.time())
        filename = path+"CivicSI-"+str(localtime[0])+"-"+str(localtime[1])+"-"+str(localtime[2])+"-"+str(localtime[3])+"-"+str(localtime[4])+"-"+str(localtime[5])+".log"
	#filename = path+"1st-"+str(localtime[0])+"-"+str(localtime[1])+"-"+str(localtime[2])+"-"+str(localtime[3])+"-"+str(localtime[4])+"-"+str(localtime[5])+".log"
	#filename = path+"2nd-"+str(localtime[0])+"-"+str(localtime[1])+"-"+str(localtime[2])+"-"+str(localtime[3])+"-"+str(localtime[4])+"-"+str(localtime[5])+".log"
	#filename = path+"3rd-"+str(localtime[0])+"-"+str(localtime[1])+"-"+str(localtime[2])+"-"+str(localtime[3])+"-"+str(localtime[4])+"-"+str(localtime[5])+".log"
	#filename = path+"4th-"+str(localtime[0])+"-"+str(localtime[1])+"-"+str(localtime[2])+"-"+str(localtime[3])+"-"+str(localtime[4])+"-"+str(localtime[5])+".log"

        self.log_file = open(filename, "w", 128)
        self.log_file.write("Time, RPM, MPH, short term fuel trim, long term fuel trim, Throttle, Gear\n");

        for item in log_items:
            self.add_log_item(item)

        self.gear_ratios = [3.267, 2.13, 1.517, 1.147, 0.921, 0.659]
        #log_formatter = logging.Formatter('%(asctime)s.%(msecs).03d,%(message)s', "%H:%M:%S")

    def connect(self):
        portnames = scanSerial()
        #portnames = ['COM10']
        print portnames
        for port in portnames:
            self.port = obd_io.OBDPort(port, None, 2, 2)
            if(self.port.State == 0):
                self.port.close()
                self.port = None
            else:
                break

        if(self.port):
            print "Connected to "+self.port.port.name
            
    def is_connected(self):
        return self.port
        
    def add_log_item(self, item):
        for index, e in enumerate(obd_sensors.SENSORS):
            if(item == e.shortname):
                self.sensorlist.append(index)
                print "Logging item: "+e.name
                break
            
            
    def record_data(self):
        if(self.port is None):
            return None
        
        print "Logging started"
        
        while 1:
            localtime = datetime.now()
            current_time = str(localtime.hour)+":"+str(localtime.minute)+":"+str(localtime.second)+"."+str(localtime.microsecond)
            log_string = current_time
            results = {}
            for index in self.sensorlist:
                (name, value, unit) = self.port.sensor(index)
                log_string = log_string + ","+str(value)
                results[obd_sensors.SENSORS[index].shortname] = value;

            gear = self.calculate_gear(results["rpm"], results["speed"])
            log_string = log_string + "," + str(gear)
            self.log_file.write(log_string+"\n")
            
    def calculate_gear(self, rpm, speed):
        if speed == "" or speed == 0:
            return 0
        if rpm == "" or rpm == 0:
            return 0

        rps = rpm/60
        mps = (speed*0.44704) #meters per second
        
        final_drive  = 4.765
        
        tire_circumference = 1.964 #meters

        current_gear_ratio = (rps / (mps / tire_circumference)) / final drive
        
        print current_gear_ratio
	
	#gear = min((abs(current_gear_ratio - i), i) for i in self.gear_ratios)[1] 
        #return gear
            
            
logitems = ["rpm","speed","short_term_fuel_trim_1","long_term_fuel_trim_1","throttle_pos","gear_ratio"]
#o = OBD_Recorder('/root/pi/logs/', logitems)
o = OBD_Recorder('/media/usb0/logs/', logitems)
o.connect()
if not o.is_connected():
    print "Not connected"
o.record_data()

Load OBDII interface from computer ports

Python
This script searches the ports on the raspberry Pi for the connection with the OBDII port. This script did not need any modification, it worked very well.
import serial
import platform

def scanSerial():
    """scan for available ports. return a list of serial names"""
    available = []
    for i in range(256):
      try: #scan standart ttyS*
        s = serial.Serial(i)
        available.append(s.portstr)
        s.close()   # explicit close 'cause of delayed GC in java
      except serial.SerialException:
        pass
    for i in range(256):
      try: #scan USB ttyACM
        s = serial.Serial("/dev/ttyACM"+str(i))
        available.append(s.portstr)
        s.close()   # explicit close 'cause of delayed GC in java
      except serial.SerialException:
        pass
    for i in range(256):
      try:
        s = serial.Serial("/dev/ttyUSB"+str(i))
        available.append(s.portstr)
        s.close()   # explicit close 'cause of delayed GC in java
      except serial.SerialException:
        pass
    for i in range(256):
      try:
        s = serial.Serial("/dev/ttyd"+str(i))
        available.append(s.portstr)
        s.close()   # explicit close 'cause of delayed GC in java
      except serial.SerialException:
        pass
        
    # ELM-USB shows up as /dev/tty.usbmodemXXXX, where XXXX is a changing hex string
    # on connection; so we have to search through all 64K options
    if len(platform.mac_ver()[0])!=0:  #search only on MAC
      for i in range (65535):
        extension = hex(i).replace("0x","", 1)
        try:
          s = serial.Serial("/dev/tty.usbmodem"+extension)
          available.append(s.portstr)
          s.close()
        except serial.SerialException:
          pass 
    
    return available

Credits

Joseph Varner

Joseph Varner

1 project • 9 followers

Comments