Harnessing Torque OBDII for Advanced Vehicle Diagnostics

For automotive enthusiasts and professionals alike, understanding vehicle performance data is crucial. Torque Pro, a popular OBDII app, offers a wealth of real-time data and diagnostic capabilities. When combined with Node-RED, an open-source flow-based programming platform, users can unlock even greater potential for monitoring and analyzing their vehicle’s health and performance. This article will guide you through the process of connecting Torque Obdii to Node-RED to create a powerful vehicle data logging and monitoring system.

To begin, ensure Torque Pro is configured to log the parameters you wish to monitor. Navigate to Settings > Data Logging and Upload within the Torque app. Here, select “What to log = All the PID’s you want to send to node-red”. This ensures all desired Parameter IDs (PIDs) are captured for transmission.

Next, activate web server uploading by checking “Upload to web server = checked”. The crucial step is setting the “Webserver URL” to point to your Node-RED instance. Enter the following URL, replacing your.nodered.server:1880 with the actual address and port of your Node-RED server: http://your.nodered.server:1880/torque/

With Torque OBDII configured, Node-RED needs to be set up to receive and process this data. Import the following Node-RED flow, which demonstrates a basic setup for receiving data and visualizing key parameters:

[ { "id": "2ce0055.8743efa", "type": "tab", "label": "Torque", "disabled": false, "info": "" }, { "id": "67436221.b54c0c", "type": "http in", "z": "2ce0055.8743efa", "name": "", "url": "/torque", "method": "get", "upload": true, "swaggerDoc": "", "x": 221, "y": 143, "wires": [ [ "f98f22cc.807ba", "557d7766.022168", "33d571b3.db242e", "69b56cf.77bc694", "683933fa.d76f1c", "ab2ff853.e8b808", "c005b8b1.f06b98", "96abaa53.c70988", "ee5bc723.594bf8", "dfdc4763.7a8fd8", "cee9fa09.98b6d8", "f2d748c5.d92da8", "936bc33f.bcd27", "97ab65f2.1a0728" ] ] }, { "id": "f98f22cc.807ba", "type": "http response", "z": "2ce0055.8743efa", "name": "", "statusCode": "", "headers": { "OK!": "" }, "x": 1290, "y": 140, "wires": [] }, { "id": "557d7766.022168", "type": "change", "z": "2ce0055.8743efa", "name": "Barometer", "rules": [ { "t": "move", "p": "payload.kff1270", "pt": "msg", "to": "payload", "tot": "msg" }, { "t": "set", "p": "topic", "pt": "msg", "to": "torque\phone\barometer", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 731, "y": 403, "wires": [ [ "536ae3f0.1980dc", "5ef6a21e.75ce4c" ] ] }, { "id": "3b30fefa.3f9012", "type": "ui_gauge", "z": "2ce0055.8743efa", "name": "", "group": "9b558fbc.438aa", "order": 1, "width": "6", "height": "6", "gtype": "gage", "title": "RPM", "label": "RPM", "format": "{{value}}", "min": 0, "max": "7000", "colors": [ "#00b500", "#e6e600", "#ca3838" ], "seg1": "", "seg2": "", "x": 1061, "y": 443, "wires": [] }, { "id": "33d571b3.db242e", "type": "change", "z": "2ce0055.8743efa", "name": "RPM", "rules": [ { "t": "move", "p": "payload.kc", "pt": "msg", "to": "payload", "tot": "msg" }, { "t": "set", "p": "topic", "pt": "msg", "to": "torque\vehicle\rpm", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 721, "y": 443, "wires": [ [ "3b30fefa.3f9012", "5ef6a21e.75ce4c" ] ] }, { "id": "69b56cf.77bc694", "type": "change", "z": "2ce0055.8743efa", "name": "Mass Air Flow Rate", "rules": [ { "t": "move", "p": "payload.k10", "pt": "msg", "to": "payload", "tot": "msg" }, { "t": "set", "p": "topic", "pt": "msg", "to": "torque\vehicle\mafrate", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 761, "y": 483, "wires": [ [ "7ee21162.28cdb", "5ef6a21e.75ce4c" ] ] }, { "id": "683933fa.d76f1c", "type": "change", "z": "2ce0055.8743efa", "name": "Throttle Position", "rules": [ { "t": "move", "p": "payload.k11", "pt": "msg", "to": "payload", "tot": "msg" }, { "t": "set", "p": "topic", "pt": "msg", "to": "torque\vehicle\throttle", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 751, "y": 523, "wires": [ [ "3765c6b.fb70f3a", "5ef6a21e.75ce4c" ] ] }, { "id": "ab2ff853.e8b808", "type": "change", "z": "2ce0055.8743efa", "name": "Coolant Temp", "rules": [ { "t": "move", "p": "payload.k5", "pt": "msg", "to": "payload", "tot": "msg" }, { "t": "set", "p": "topic", "pt": "msg", "to": "torque\vehicle\coolant", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 741, "y": 563, "wires": [ [ "258b6f62.e82ab" ] ] }, { "id": "c005b8b1.f06b98", "type": "change", "z": "2ce0055.8743efa", "name": "Volage", "rules": [ { "t": "move", "p": "payload.kff1238", "pt": "msg", "to": "payload", "tot": "msg" }, { "t": "set", "p": "topic", "pt": "msg", "to": "torque\obd\voltage", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 721, "y": 603, "wires": [ [ "5b8bdb33.d96134", "5ef6a21e.75ce4c" ] ] }, { "id": "96abaa53.c70988", "type": "change", "z": "2ce0055.8743efa", "name": "Vacuum", "rules": [ { "t": "move", "p": "payload.kff1202", "pt": "msg", "to": "payload", "tot": "msg" }, { "t": "set", "p": "topic", "pt": "msg", "to": "torque\vehicle\vacuum", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 731, "y": 643, "wires": [ [ "913a6311.540cd", "5ef6a21e.75ce4c" ] ] }, { "id": "3765c6b.fb70f3a", "type": "ui_gauge", "z": "2ce0055.8743efa", "name": "", "group": "9b558fbc.438aa", "order": 2, "width": "3", "height": "3", "gtype": "donut", "title": "Throttle Position", "label": "%", "format": "{{value}}", "min": 0, "max": "100", "colors": [ "#00b500", "#e6e600", "#ca3838" ], "seg1": "", "seg2": "", "x": 1091, "y": 523, "wires": [] }, { "id": "ee5bc723.594bf8", "type": "change", "z": "2ce0055.8743efa", "name": "Speed", "rules": [ { "t": "move", "p": "payload.kd", "pt": "msg", "to": "payload", "tot": "msg" }, { "t": "set", "p": "topic", "pt": "msg", "to": "torque\vehicle\speed", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 721, "y": 683, "wires": [ [ "c3863c64.b8c2d", "5ef6a21e.75ce4c" ] ] }, { "id": "c3863c64.b8c2d", "type": "ui_gauge", "z": "2ce0055.8743efa", "name": "", "group": "ea9cdc42.4bbc8", "order": 0, "width": 0, "height": 0, "gtype": "gage", "title": "Speed", "label": "MPH", "format": "{{value}}", "min": 0, "max": "100", "colors": [ "#00b500", "#e6e600", "#ca3838" ], "seg1": "", "seg2": "", "x": 1061, "y": 683, "wires": [] }, { "id": "7ee21162.28cdb", "type": "ui_gauge", "z": "2ce0055.8743efa", "name": "", "group": "9b558fbc.438aa", "order": 3, "width": "2", "height": "3", "gtype": "wave", "title": "Mass Air Flow", "label": "g/s", "format": "{{value}}", "min": 0, "max": "100", "colors": [ "#00b500", "#e6e600", "#ca3838" ], "seg1": "", "seg2": "", "x": 1091, "y": 483, "wires": [] }, { "id": "536ae3f0.1980dc", "type": "ui_gauge", "z": "2ce0055.8743efa", "name": "", "group": "26a930d9.ff8c", "order": 0, "width": "3", "height": "3", "gtype": "gage", "title": "Barometer", "label": "units", "format": "{{value}}", "min": "800", "max": "1100", "colors": [ "#00b500", "#e6e600", "#ca3838" ], "seg1": "", "seg2": "", "x": 1071, "y": 403, "wires": [] }, { "id": "dfdc4763.7a8fd8", "type": "change", "z": "2ce0055.7a8fd8", "name": "Speed GPS", "rules": [ { "t": "move", "p": "payload.kff1001", "pt": "msg", "to": "payload", "tot": "msg" }, { "t": "set", "p": "topic", "pt": "msg", "to": "torque\phone\speed", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 741, "y": 723, "wires": [ [ "535662ad.f1628c", "5ef6a21e.75ce4c" ] ] }, { "id": "535662ad.f1628c", "type": "ui_gauge", "z": "2ce0055.8743efa", "name": "", "group": "26a930d9.ff8c", "order": 0, "width": "3", "height": "3", "gtype": "gage", "title": "Speed GPS", "label": "MPH", "format": "{{value}}", "min": 0, "max": "100", "colors": [ "#00b500", "#e6e600", "#ca3838" ], "seg1": "", "seg2": "", "x": 1081, "y": 723, "wires": [] }, { "id": "5b8bdb33.d96134", "type": "ui_gauge", "z": "2ce0055.8743efa", "name": "", "group": "ea9cdc42.4bbc8", "order": 0, "width": "3", "height": "3", "gtype": "gage", "title": "Voltage", "label": "V", "format": "{{value}}", "min": "9", "max": "15", "colors": [ "#ff0000", "#008000", "#ff0000" ], "seg1": "13", "seg2": "14.3", "x": 1071, "y": 603, "wires": [] }, { "id": "b0123228.4a063", "type": "ui_gauge", "z": "2ce0055.8743efa", "name": "", "group": "9b558fbc.438aa", "order": 5, "width": "3", "height": "3", "gtype": "gage", "title": "Coolant Temp", "label": "F", "format": "{{value}}", "min": 0, "max": "250", "colors": [ "#00b500", "#e6e600", "#ca3838" ], "seg1": "", "seg2": "", "x": 1081, "y": 563, "wires": [] }, { "id": "913a6311.540cd", "type": "ui_gauge", "z": "2ce0055.8743efa", "name": "", "group": "9b558fbc.438aa", "order": 6, "width": "3", "height": "3", "gtype": "donut", "title": "Vacuum", "label": "", "format": "{{value}}", "min": "-20", "max": "0", "colors": [ "#00b500", "#e6e600", "#ca3838" ], "seg1": "", "seg2": "", "x": 1071, "y": 643, "wires": [] }, { "id": "cee9fa09.98b6d8", "type": "json", "z": "2ce0055.8743efa", "name": "", "pretty": false, "x": 751, "y": 198, "wires": [ [ "3b9be5d8.84e04a" ] ] }, { "id": "f2d748c5.d92da8", "type": "function", "z": "2ce0055.8743efa", "name": "Parse Date", "func": "var date = parseInt(msg.payload.time);nnmsg.payload = new Date(date* 1).toLocaleString([], { hour12: true}).slice(0, 19).replace('T', ' ');nreturn msg;", "outputs": 1, "noerr": 0, "x": 730, "y": 780, "wires": [ [ "88bfc628.5727b8" ] ] }, { "id": "88bfc628.5727b8", "type": "ui_text", "z": "2ce0055.8743efa", "group": "26a930d9.ff8c", "order": 1, "width": 0, "height": 0, "name": "Last Update", "label": "Updated", "format": "{{msg.payload}}", "layout": "row-spread", "x": 1070, "y": 780, "wires": [] }, { "id": "258b6f62.e82ab", "type": "function", "z": "2ce0055.8743efa", "name": "CtoF", "func": "var tempc = msg.payload;n tempf = tempc * 9/5 + 32;n tempf = Math.round(tempf * 10) / 10;n msg.payload = tempf;n return msg;", "outputs": 1, "noerr": 0, "x": 910, "y": 560, "wires": [ [ "b0123228.4a063", "5ef6a21e.75ce4c" ] ] }, { "id": "936bc33f.bcd27", "type": "change", "z": "2ce0055.8743efa", "name": "IntakeTemp", "rules": [ { "t": "move", "p": "payload.kf", "pt": "msg", "to": "payload", "tot": "msg" }, { "t": "set", "p": "topic", "pt": "msg", "to": "torque\vehicle\intake", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 730, "y": 840, "wires": [ [ "a6732e91.735a9" ] ] }, { "id": "ee354102.4a8d8", "type": "ui_gauge", "z": "2ce0055.8743efa", "name": "", "group": "9b558fbc.438aa", "order": 4, "width": "3", "height": "3", "gtype": "gage", "title": "Intake Temp", "label": "F", "format": "{{value}}", "min": 0, "max": "250", "colors": [ "#00b500", "#e6e600", "#ca3838" ], "seg1": "", "seg2": "", "x": 1070, "y": 840, "wires": [] }, { "id": "a6732e91.735a9", "type": "function", "z": "2ce0055.8743efa", "name": "CtoF", "func": "var tempc = msg.payload;n tempf = tempc * 9/5 + 32;n tempf = Math.round(tempf * 10) / 10;n msg.payload = tempf;n return msg;", "outputs": 1, "noerr": 0, "x": 899, "y": 837, "wires": [ [ "ee354102.4a8d8", "5ef6a21e.75ce4c" ] ] }, { "id": "3b9be5d8.84e04a", "type": "change", "z": "2ce0055.8743efa", "name": "", "rules": [ { "t": "set", "p": "topic", "pt": "msg", "to": "torque\raw", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1034, "y": 202, "wires": [ [ "5ef6a21e.75ce4c" ] ] }, { "id": "5ef6a21e.75ce4c", "type": "mqtt out", "z": "2ce0055.8743efa", "name": "", "topic": "", "qos": "0", "retain": "true", "broker": "fee1fac2.261a88", "x": 1292, "y": 193, "wires": [] }, { "id": "97ab65f2.1a0728", "type": "function", "z": "2ce0055.8743efa", "name": "copy to json", "func": "msg.payload.json = JSON.stringify(msg.payload);nreturn msg;", "outputs": 1, "noerr": 0, "x": 770, "y": 100, "wires": [ [ "72347975.0e2688" ] ] }, { "id": "72347975.0e2688", "type": "function", "z": "2ce0055.8743efa", "name": "Create query in topic", "func": "var out = "INSERT INTO torque_json (timestamp,json)"nvar date = Number(msg.payload.time);nout = out + "VALUES ('" + new Date(date* 1).toISOString().slice(0, 19).replace('T', ' ') + "','" nout = out + String(msg.payload.json) + "');"n nmsg.topic=out;nnreturn msg;", "outputs": 1, "noerr": 0, "x": 960, "y": 100, "wires": [ [ "dba0040d.49d798" ] ] }, { "id": "dba0040d.49d798", "type": "mysql", "z": "2ce0055.8743efa", "mydb": "4cd2c8.ee368d38", "name": "", "x": 1300, "y": 100, "wires": [ [] ] }, { "id": "9b558fbc.438aa", "type": "ui_group", "z": "", "name": "Motor", "tab": "ac99e377.fdb83", "order": 1, "disp": true, "width": "9" }, { "id": "ea9cdc42.4bbc8", "type": "ui_group", "z": "", "name": "Van", "tab": "ac99e377.fdb83", "order": 2, "disp": true, "width": "6" }, { "id": "26a930d9.ff8c", "type": "ui_group", "z": "", "name": "Phone", "tab": "ac99e377.fdb83", "order": 3, "disp": true, "width": "6" }, { "id": "fee1fac2.261a88", "type": "mqtt-broker", "z": "", "broker": "mqtt.YOUR.SERVER", "port": "1883", "clientid": "nodered", "usetls": false, "compatmode": true, "keepalive": "60", "cleansession": true, "willTopic": "", "willQos": "0", "willPayload": "", "birthTopic": "", "birthQos": "0", "birthPayload": "" }, { "id": "4cd2c8.ee368d38", "type": "MySQLdatabase", "z": "", "host": "drobo5n.YOUR.SERVER", "port": "3306", "db": "openhab", "tz": "CST" }, { "id": "ac99e377.fdb83", "type": "ui_tab", "z": "", "name": "Torque", "icon": "fa-car", "order": 2 } ]

This flow includes an http in node to receive data from Torque, an http response node to send the “OK!” confirmation back to the app, and various change and gauge nodes to process and display data such as RPM, speed, coolant temperature, and voltage.

Optionally, the provided flow also includes nodes for writing data to a MySQL database. If real-time monitoring is your primary goal, or if you prefer using openHAB or another system for logging, the MySQL nodes can be removed.

By following these steps, you can seamlessly integrate Torque OBDII with Node-RED, creating a versatile platform for vehicle diagnostics, data visualization, and deeper insights into your car’s operation.

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply

Your email address will not be published. Required fields are marked *