Liu Song’s Projects


~/Projects/confbook

git clone https://code.lsong.org/confbook

Commit

Commit
d57dc73aef93dcd0175659bf8a331b8997acc709
Author
Lsong <[email protected]>
Date
2022-10-11 14:01:22 +0800 +0800
Diffstat
 README.md | 4 
 acme/README.md | 7 
 android/README.md | 15 
 android/adb-apk-install.sh | 4 
 aria2/README.md | 9 
 awtrix/README.md | 4 
 centos/README.md | 13 
 centos/disable-selinux.sh | 3 
 clash/README.md | 13 
 clash/dnsmasq-clash.conf | 2 
 cron/README.md | 3 
 dnsmasq/README.md | 5 
 dnsmasq/conf.available/clash.conf | 3 
 docker/README.md | 14 
 docker/scripts/install.sh | 7 
 emqx/README.md | 4 
 frp/README.md | 2 
 git/README.md | 29 
 grafana/README.md | 15 
 grafana/torque/.gitignore | 1 
 grafana/torque/LICENSE | 201 ++
 grafana/torque/README.md | 24 
 grafana/torque/flow-torque.json | 1510 +++++++++++++++++++++
 grafana/torque/grafana-torque.json | 2216 +++++++++++++++++++++++++++++++
 grafana/torque/telegraf-torque.conf | 42 

update


diff --git a/README.md b/README.md
index 2dd3d98dbdc7ab2846d386df55a7a067cadc2545..36437d1987ac44659fa2fbfcb8a30cc7fc3b3daa 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# dotfiles
+# confbook
 
 > my dotfiles
 
@@ -7,7 +7,7 @@
 ## Install
 
 ```bash
-curl -s https://raw.githubusercontent.com/song940/dotfiles/master/install.sh | bash
+curl -s https://raw.githubusercontent.com/song940/confbook/master/install.sh | bash
 ```
 
 ```sh




diff --git a/acme/README.md b/acme/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..25279cef2f10b87eebc12d46d18af53a483752ae
--- /dev/null
+++ b/acme/README.md
@@ -0,0 +1,7 @@
+## acme.sh
+
+A pure Unix shell script implementing ACME client protocol
+
+https://github.com/acmesh-official/acme.sh
+
+https://letsencrypt.org




diff --git a/android/README.md b/android/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..d2bc0d43cce63fe6ca2d8525dcaa4b235b43ba07
--- /dev/null
+++ b/android/README.md
@@ -0,0 +1,15 @@
+## Android
+
++ F-Droid
++ Openvpn for Android
++ Termux
++ Xposed
++ Island
+
+Install `android-platform-tools`
+
+```sh
+apt install android-tools
+pkg install android-tools
+apk add android-tools
+```




diff --git a/android/adb-apk-install.sh b/android/adb-apk-install.sh
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..8ff13f87bc382e4b0aaf2f04d6108a446d25c117 100755
--- a/android/adb-apk-install.sh
+++ b/android/adb-apk-install.sh
@@ -0,0 +1,4 @@
+
+apk=$1
+# adb shell pm install $apk
+adb install $apk




diff --git a/aria2/README.md b/aria2/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..0844230d12d929af7b4165b24da9134617dcade1
--- /dev/null
+++ b/aria2/README.md
@@ -0,0 +1,9 @@
+## Aria2
+
+> aria2 is a lightweight multi-protocol & multi-source, cross platform download utility operated in command-line. It supports HTTP/HTTPS, FTP, SFTP, BitTorrent and Metalink.
+
+https://aria2.github.io
+https://github.com/aria2/aria2
+
+Web:
+http://ariang.mayswind.net/latest




diff --git a/awtrix/README.md b/awtrix/README.md
index d7544476a8663f7df4202438fc23614ccc384b77..df1c102f132f704ed9ced35eaa66c002f4e11b47 100644
--- a/awtrix/README.md
+++ b/awtrix/README.md
@@ -1,3 +1,7 @@
+## Awtrix
 
+Firmware:
+// todo:
 
+Controller Server:
 https://blueforcer.de/awtrix/stable/awtrix.jar




diff --git a/centos/README.md b/centos/README.md
index 7ee0c57124f3bda9cae63d5efd9c40e5e329e1a5..1d26fbfad0d33db578bfc9814db0f60708bee7ac 100644
--- a/centos/README.md
+++ b/centos/README.md
@@ -1,12 +1,23 @@
+## CentOS
 
+### Network:
 
+```
+
+
 setenforce 0
 
-/etc/selinux/config
+setenforce 0
 
+# set `SELINUX=disabled` in /etc/selinux/config
+
 SELINUX=disabled
 
+
 
+### Firewall configuration
+```sh
 firewall-cmd --list-ports
 firewall-cmd --permanent --add-port=200-300/tcp
 firewall-cmd --reload
+```




diff --git a/centos/disable-selinux.sh b/centos/disable-selinux.sh
new file mode 100755
index 0000000000000000000000000000000000000000..d63d9504bcf149fc95bf3bae4fc07272d97c07ae
--- /dev/null
+++ b/centos/disable-selinux.sh
@@ -0,0 +1,3 @@
+
+setenforce 0
+sed -i 's/enforcing/disabled/g' /etc/selinux/config




diff --git a/clash/README.md b/clash/README.md
index 08406283e6036ae04b68839952ff4694856d34ab..9c3a5f7d9734cbabe6bdb10992c0d0742463253d 100644
--- a/clash/README.md
+++ b/clash/README.md
@@ -7,7 +7,7 @@ ### Docs
 
 https://lancellc.gitbook.io/clash
 
-### install
+### Install
 
 https://github.com/Dreamacro/clash/releases/tag/premium
 https://github.com/Dreamacro/clash/releases/download/v0.16.0/clash-darwin-amd64-v0.16.0.gz
@@ -17,3 +17,14 @@
 ```sh
 setcap cap_net_bind_service,cap_net_admin+ep /usr/local/bin/clash
 ```
+
+### OpenWRT
+
+1. Download [Clash Premium]() from github.com
+2. `gunzip -c ` to /usr/local/bin
+3. copy config files to /etc/clash, make sure mode is *fakeip* in config file.
+4. start up clash using `/usr/local/bin/clash -d /etc/clash`, 首次启动会下载 mmdb 数据库文件,It'll take a moment,同时观察一下端口情况是否 *port in used* 。
+5. copy startup script to init.d/clash, `service clash start` and `update-rc.d clash enable`
+6. clash dns listen 1035, dnsmasq `server=/127.0.0.1#1035/` and no-cache, restart dnsmasq
+7. Set forwarding from `reject` to `allow` in OpenWRT's *Firewall Zone Settings* .
+8. Reboot the Router.




diff --git a/clash/dnsmasq-clash.conf b/clash/dnsmasq-clash.conf
new file mode 100644
index 0000000000000000000000000000000000000000..d52d84372db9f263d209b6f74598500194ea7ea2
--- /dev/null
+++ b/clash/dnsmasq-clash.conf
@@ -0,0 +1,2 @@
+
+server=127.0.0.1#1053




diff --git a/cron/README.md b/cron/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..7c30ca549553727c9f6af37a2cba38ad8bf056ac
--- /dev/null
+++ b/cron/README.md
@@ -0,0 +1,3 @@
+## Crontab
+
+https://crontab.guru




diff --git a/dnsmasq/README.md b/dnsmasq/README.md
index 64ac27a0343686dcebe9a034fc3cd3ebe6c40782..0ede525aa06605829e35b55f2c82cec11e36fdf9 100644
--- a/dnsmasq/README.md
+++ b/dnsmasq/README.md
@@ -1 +1,4 @@
-## dnsmasq.conf
+## Dnsmasq
+
++ DNS
++ DHCP




diff --git a/dnsmasq/conf.available/clash.conf b/dnsmasq/conf.available/clash.conf
old mode 100644
new mode 120000
index d52d84372db9f263d209b6f74598500194ea7ea2..3feff650ce22bab0f42288c5a25f5394cc4b47a9
--- a/dnsmasq/conf.available/clash.conf
+++ b/dnsmasq/conf.available/clash.conf
@@ -1,2 +1 @@
-
-server=127.0.0.1#1053
+../../clash/dnsmasq-clash.conf
\ No newline at end of file




diff --git a/docker/README.md b/docker/README.md
index 66cfdd89a3284639c1ea8dbaff06194b87c6b666..79b09a534b377c5b468b9dad6eac639a4a83c0a6 100644
--- a/docker/README.md
+++ b/docker/README.md
@@ -1,20 +1,30 @@
+
 
 
+
 ## Install Docker
 
+```
 ./install-docker.sh
+```
 
 
+./install-docker.sh
-## Install Docker Compose
+
 
+## Install Docker Compose
+
 curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
 
+Cannot start service db: cgroups: cgroup mountpoint does not exist: unknown
 
+https://github.com/docker/for-linux/issues/219#issuecomment-375160449
+```
 
 Cannot start service db: cgroups: cgroup mountpoint does not exist: unknown
 https://github.com/docker/for-linux/issues/219#issuecomment-375160449
 
-```
+```sh
 sudo mkdir /sys/fs/cgroup/systemd
 sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd
 ```




diff --git a/docker/scripts/install.sh b/docker/scripts/install.sh
index 752703148af51524b8a93a4aa9e2ce4dd8c6d9d1..a2fb30a2230f576d66be652a8028f7444e7980ba 100755
--- a/docker/scripts/install.sh
+++ b/docker/scripts/install.sh
@@ -1,8 +1,9 @@
 #!/usr/bin/env sh
 
-apt install iptables -y
+v="20.10.9"
-# curl -sL https://download.docker.com/linux/static/stable/x86_64/docker-19.03.9.tgz | tar -xzvf - -C /usr/local
+
-curl -sL https://download.docker.com/linux/static/stable/x86_64/docker-20.10.9.tgz | tar -xzvf - -C /usr/local
+apt install iptables -y
+curl -sL https://download.docker.com/linux/static/stable/x86_64/docker-${v}.tgz | tar -xzvf - -C /usr/local
 ln -s /usr/local/docker/* /usr/local/bin
 ln -s /root/confbook/docker /etc/
 




diff --git a/emqx/README.md b/emqx/README.md
index 910996d71b842c3630e145a694a1300cbbb18794..323d6fc8b3a3889cb16976c439cb825e12c2858e 100644
--- a/emqx/README.md
+++ b/emqx/README.md
@@ -1,3 +1,7 @@
+
+## EMQX
+
+### Password configuration
 
 ```sh
 docker exec -it mqtt-emqx-1 ./bin/emqx_ctl admins passwd admin password




diff --git a/frp/README.md b/frp/README.md
index b0e317c6b24cca0d57e114642295452632f7e762..ac04022ef85edb36aa701ec6f313bb816ca36cfe 100644
--- a/frp/README.md
+++ b/frp/README.md
@@ -1,3 +1,3 @@
-
+## FRP
 
 https://github.com/fatedier/frp/releases/download/v0.23.1/frp_0.23.1_linux_amd64.tar.gz




diff --git a/git/README.md b/git/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..83030f59a2a8d0115518bc7fe277906c96c1f7fd
--- /dev/null
+++ b/git/README.md
@@ -0,0 +1,29 @@
+## Git
+
+https://git-scm.com
+
+### Install
+
+```sh
+# macOS
+brew install git
+# Linux
+apt install git
+yum install git
+apk add git
+# Termux
+pkg install git
+```
+
+### Setup
+
+```sh
+git config --global user.name "yourname"
+git config --global user.email "[email protected]"
+```
+
+or
+
+```sh
+ln -s /root/confbook/git/config ~/.gitconfig
+```




diff --git a/grafana/README.md b/grafana/README.md
index e43a97364ddb86c05504fa4f6cdd9b1bc52b4d24..b8b147f72e1d5eec2c89aec325ccd11621a290e8 100644
--- a/grafana/README.md
+++ b/grafana/README.md
@@ -1,10 +1,12 @@
 # Grafana
 
+Setup datasource from Grafana Settings
+
 https://grafana.com/grafana/dashboards/928
 https://grafana.com/grafana/dashboards/5063-nginx/
 
 
-# Clash Tracing Dashboard
+## Clash Tracing Dashboard
 
 An example of a clash tracing exporter API.
 
@@ -18,8 +20,19 @@ 1. modify `.env` and start (`docker-compose up -d`)
 2. setup Grafana (add datasource)
 
 
+## Torque-Grafana-Dashboard
+
+> Grafana Dashboard for Torque App Stats (Android, ODBII) - plot, pivot and display your
+> Using seanauff's wonderful Node Red endpoint to push the data from Torque -> Node Red -> MQTT and into Influx/Grafana
 
 # Grafana
+
+
+![Example](torque/images/Torque0.png)
+![Example](torque/images/Torque1.png)
+![Example](torque/images/Torque2.png)
+
+https://github.com/seanauff/node-red-torque
 
 ```
 grafana-cli plugins install grafana-worldmap-panel




diff --git a/grafana/torque/.gitignore b/grafana/torque/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..187d3623f5f41df2a34ac700a8556bf39c6a9f08
--- /dev/null
+++ b/grafana/torque/.gitignore
@@ -0,0 +1 @@
+/images




diff --git a/grafana/torque/LICENSE b/grafana/torque/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..261eeb9e9f8b2b4b0d119366dda99c6fd7d35c64
--- /dev/null
+++ b/grafana/torque/LICENSE
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.




diff --git a/grafana/torque/README.md b/grafana/torque/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..d1d0632da719b0e1754ad1660cf55485c5c81c5a
--- /dev/null
+++ b/grafana/torque/README.md
@@ -0,0 +1,24 @@
+# Torque-Grafana-Dashboard
+Grafana Dashboard for Torque App Stats (Android, ODBII) - plot, pivot and display your
+
+Using seanauff's wonderful Node Red endpoint to push the data from Torque -> Node Red -> MQTT and into Influx/Grafana
+
+https://github.com/seanauff/node-red-torque
+
+![Example](images/Torque0.png)
+![Example](images/Torque1.png)
+![Example](images/Torque2.png)
+
+
+# Requires;
+
+1. Torque Pro App for Android: https://play.google.com/store/apps/details?id=org.prowl.torque&hl=en_US
+   1. ODBII Bluetooth connector (Amazon should have one for <$10)
+1. Node Red: https://github.com/node-red
+1. Node-Red-Torque: https://github.com/seanauff/node-red-torque
+1. MQTT (Personally using Mosquitto) https://mosquitto.org/
+1. Telegraf (Using MQTT Collector) https://www.influxdata.com/time-series-platform/telegraf/
+1. InfluxDB https://www.influxdata.com/
+1. Grafana https://grafana.com/
+   1. World Map Plugin for Grafana https://grafana.com/grafana/plugins/grafana-worldmap-panel/installation
+   1. Pie Chart Plugin for Grafana https://grafana.com/grafana/plugins/grafana-piechart-panel




diff --git a/grafana/torque/flow-torque.json b/grafana/torque/flow-torque.json
new file mode 100644
index 0000000000000000000000000000000000000000..c4ba591c4bcb3e00da4bf97711c5ff2f07eab965
--- /dev/null
+++ b/grafana/torque/flow-torque.json
@@ -0,0 +1,1510 @@
+[
+  {
+  "id": "1051da59.797066",
+  "type": "tab",
+  "label": "Torque",
+  "disabled": false,
+  "info": ""
+  },
+  {
+  "id": "6d632dc8.c3b994",
+  "type": "http in",
+  "z": "1051da59.797066",
+  "name": "",
+  "url": "/upload",
+  "method": "get",
+  "upload": true,
+  "swaggerDoc": "",
+  "x": 130,
+  "y": 60,
+  "wires": [
+  [
+  "cf272a44.fc08b"
+  ]
+  ]
+  },
+  {
+  "id": "d3c7f0f6.360e",
+  "type": "http response",
+  "z": "1051da59.797066",
+  "name": "http response OK!",
+  "statusCode": "200",
+  "headers": {
+  "OK!": ""
+  },
+  "x": 510,
+  "y": 40,
+  "wires": []
+  },
+  {
+  "id": "8b6d2f73.79c94",
+  "type": "json",
+  "z": "1051da59.797066",
+  "name": "",
+  "property": "payload",
+  "action": "obj",
+  "pretty": false,
+  "x": 410,
+  "y": 160,
+  "wires": [
+  [
+  "ad29e8dd.74e438",
+  "d70fbc90.23d5c"
+  ]
+  ]
+  },
+  {
+  "id": "ad29e8dd.74e438",
+  "type": "change",
+  "z": "1051da59.797066",
+  "name": "",
+  "rules": [
+  {
+  "t": "set",
+  "p": "topic",
+  "pt": "msg",
+  "to": "torque/raw",
+  "tot": "str"
+  }
+  ],
+  "action": "",
+  "property": "",
+  "from": "",
+  "to": "",
+  "reg": false,
+  "x": 770,
+  "y": 160,
+  "wires": [
+  []
+  ]
+  },
+  {
+  "id": "b043ff20.449ac8",
+  "type": "debug",
+  "z": "1051da59.797066",
+  "name": "",
+  "active": true,
+  "tosidebar": false,
+  "console": false,
+  "tostatus": false,
+  "complete": "payload",
+  "targetType": "msg",
+  "x": 750,
+  "y": 80,
+  "wires": []
+  },
+  {
+  "id": "ffec7c10.fa3d6",
+  "type": "mqtt out",
+  "z": "1051da59.797066",
+  "name": "",
+  "topic": "",
+  "qos": "",
+  "retain": "",
+  "broker": "56a849d2.194a68",
+  "x": 1570,
+  "y": 160,
+  "wires": []
+  },
+  {
+  "id": "52b74919.1194b8",
+  "type": "function",
+  "z": "1051da59.797066",
+  "name": "str2num",
+  "func": "msg.payload.time = parseInt(msg.payload.time);\nmsg.payload.MAFR = parseFloat(msg.payload.MAFR);\nmsg.payload.throttlePosManifold = parseFloat(msg.payload.throttlePosManifold);\n//msg.payload.airStatus = parseFloat(msg.payload.airStatus);\nmsg.payload.fuelTrimBank1Sensor1 = parseFloat(msg.payload.fuelTrimBank1Sensor1);\nmsg.payload.fuelTrimBank1Sensor2 = parseFloat(msg.payload.fuelTrimBank1Sensor2);\nmsg.payload.fuelTrimBank1Sensor3 = parseFloat(msg.payload.fuelTrimBank1Sensor3);\nmsg.payload.fuelTrimBank1Sensor4 = parseFloat(msg.payload.fuelTrimBank1Sensor4);\nmsg.payload.fuelTrimBank2Sensor1 = parseFloat(msg.payload.fuelTrimBank2Sensor1);\nmsg.payload.fuelTrimBank2Sensor2 = parseFloat(msg.payload.fuelTrimBank2Sensor2);\nmsg.payload.fuelTrimBank2Sensor3 = parseFloat(msg.payload.fuelTrimBank2Sensor3);\nmsg.payload.fuelTrimBank2Sensor4 = parseFloat(msg.payload.fuelTrimBank2Sensor4);\nmsg.payload.runTime = parseFloat(msg.payload.runTime);\nmsg.payload.distTraveledWithCELLit = parseFloat(msg.payload.distTraveledWithCELLit);\nmsg.payload.fuelRailPressureManifoldVacuumRelative = parseFloat(msg.payload.fuelRailPressureManifoldVacuumRelative);\nmsg.payload.fuelRailPressure = parseFloat(msg.payload.fuelRailPressure);\nmsg.payload.O2SensorEquivalenceRatio1 = parseFloat(msg.payload.O2SensorEquivalenceRatio1);\nmsg.payload.O2SensorEquivalenceRatio2 = parseFloat(msg.payload.O2SensorEquivalenceRatio2);\nmsg.payload.O2SensorEquivalenceRatio3 = parseFloat(msg.payload.O2SensorEquivalenceRatio3);\nmsg.payload.O2SensorEquivalenceRatio4 = parseFloat(msg.payload.O2SensorEquivalenceRatio4);\nmsg.payload.O2SensorEquivalenceRatio5 = parseFloat(msg.payload.O2SensorEquivalenceRatio5);\nmsg.payload.O2SensorEquivalenceRatio6 = parseFloat(msg.payload.O2SensorEquivalenceRatio6);\nmsg.payload.O2SensorEquivalenceRatio7 = parseFloat(msg.payload.O2SensorEquivalenceRatio7);\nmsg.payload.O2SensorEquivalenceRatio8 = parseFloat(msg.payload.O2SensorEquivalenceRatio8);\nmsg.payload.EGRCommanded = parseFloat(msg.payload.EGRCommanded);\nmsg.payload.EGRError = parseFloat(msg.payload.EGRError);\nmsg.payload.fuelLevelFromECU = parseFloat(msg.payload.fuelLevelFromECU);\n//msg.payload.fuelStatus = parseFloat(msg.payload.fuelStatus);\nmsg.payload.distTraveledSinceCodesCleared = parseFloat(msg.payload.distTraveledSinceCodesCleared);\nmsg.payload.evapSysVaporPressure = parseFloat(msg.payload.evapSysVaporPressure);\nmsg.payload.barometerVehicle = parseFloat(msg.payload.barometerVehicle);\nmsg.payload.O2SensorEquivalenceRatioAlternate1 = parseFloat(msg.payload.O2SensorEquivalenceRatioAlternate1);\nmsg.payload.catalystTempBank1Sensor1 = parseFloat(msg.payload.catalystTempBank1Sensor1);\nmsg.payload.catalystTempBank2Sensor1 = parseFloat(msg.payload.catalystTempBank2Sensor1);\nmsg.payload.catalystTempBank1Sensor2 = parseFloat(msg.payload.catalystTempBank1Sensor2);\nmsg.payload.catalystTempBank2Sensor2 = parseFloat(msg.payload.catalystTempBank2Sensor2);\nmsg.payload.engineLoad = parseFloat(msg.payload.engineLoad);\nmsg.payload.voltageControlModule = parseFloat(msg.payload.voltageControlModule);\nmsg.payload.engineLoadAbsolute = parseFloat(msg.payload.engineLoadAbsolute);\nmsg.payload.commandedEquivalenceRatioLambda = parseFloat(msg.payload.commandedEquivalenceRatioLambda);\nmsg.payload.throttlePositionRelative = parseFloat(msg.payload.throttlePositionRelative);\nmsg.payload.ambientAirTemp = parseFloat(msg.payload.ambientAirTemp);\nmsg.payload.throttlePositionAbsoluteB = parseFloat(msg.payload.throttlePositionAbsoluteB);\nmsg.payload.acceleratorPedalPositionD = parseFloat(msg.payload.acceleratorPedalPositionD);\nmsg.payload.acceleratorPedalPositionE = parseFloat(msg.payload.acceleratorPedalPositionE);\nmsg.payload.acceleratorPedalPositionF = parseFloat(msg.payload.acceleratorPedalPositionF);\nmsg.payload.engineCoolantTemp = parseFloat(msg.payload.engineCoolantTemp);\nmsg.payload.acceleratorPedalPositionRelative = parseFloat(msg.payload.acceleratorPedalPositionRelative);\nmsg.payload.ethanolFuelPercent = parseFloat(msg.payload.ethanolFuelPercent);\nmsg.payload.relativeAcceleratorPedalPosition = parseFloat(msg.payload.relativeAcceleratorPedalPosition);\nmsg.payload.hybridBatteryCharge = parseFloat(msg.payload.hybridBatteryCharge);\nmsg.payload.engineOilTemp = parseFloat(msg.payload.engineOilTemp);\nmsg.payload.fuelTrimShortTermbank1 = parseFloat(msg.payload.fuelTrimShortTermbank1);\nmsg.payload.torqueDemanded = parseFloat(msg.payload.torqueDemanded);\nmsg.payload.torqueActual = parseFloat(msg.payload.torqueActual);\nmsg.payload.torqueReference = parseFloat(msg.payload.torqueReference);\nmsg.payload.fuelTrimLongTermBank1 = parseFloat(msg.payload.fuelTrimLongTermBank1);\nmsg.payload.turboPressureControl = parseFloat(msg.payload.turboPressureControl);\nmsg.payload.exhaustPressure = parseFloat(msg.payload.exhaustPressure);\nmsg.payload.chargeAirCoolerTemp = parseFloat(msg.payload.chargeAirCoolerTemp);\nmsg.payload.exhaustGasTempBank1Sensor1 = parseFloat(msg.payload.exhaustGasTempBank1Sensor1);\nmsg.payload.exhaustGasTempBank2Sensor1 = parseFloat(msg.payload.exhaustGasTempBank2Sensor1);\nmsg.payload.DPFPressure = parseFloat(msg.payload.DPFPressure);\nmsg.payload.DPFTemp = parseFloat(msg.payload.DPFTemp);\nmsg.payload.fuelTrimShortTermBank2 = parseFloat(msg.payload.fuelTrimShortTermBank2);\nmsg.payload.NOxPreSCR = parseFloat(msg.payload.NOxPreSCR);\nmsg.payload.fuelTrimLongTermBank2 = parseFloat(msg.payload.fuelTrimLongTermBank2);\nmsg.payload.fuelPressure = parseFloat(msg.payload.fuelPressure);\nmsg.payload.intakeManifoldPressure = parseFloat(msg.payload.intakeManifoldPressure);\nmsg.payload.transmissionTempMethod2 = parseFloat(msg.payload.transmissionTempMethod2);\nmsg.payload.engineRPM = parseFloat(msg.payload.engineRPM);\nmsg.payload.speedOBD = parseFloat(msg.payload.speedOBD);\nmsg.payload.timingAdvance = parseFloat(msg.payload.timingAdvance);\nmsg.payload.intakeAirTemp = parseFloat(msg.payload.intakeAirTemp);\nmsg.payload.transmissionTempMethod1 = parseFloat(msg.payload.transmissionTempMethod1);\nmsg.payload.GPSSpeed = parseFloat(msg.payload.GPSSpeed);\nmsg.payload.GPSLongitude = parseFloat(msg.payload.GPSLongitude);\nmsg.payload.GPSLatitude = parseFloat(msg.payload.GPSLatitude);\nmsg.payload.GPSBearing1 = parseFloat(msg.payload.GPSBearing1);\nmsg.payload.GPSAltitude = parseFloat(msg.payload.GPSAltitude);\nmsg.payload.MPGInstant = parseFloat(msg.payload.MPGInstant);\nmsg.payload.turboBoostandVac = parseFloat(msg.payload.turboBoostandVac);\nmsg.payload.KPLInstant = parseFloat(msg.payload.KPLInstant);\nmsg.payload.tripDistance = parseFloat(msg.payload.tripDistance);\nmsg.payload.MPGtripAvg = parseFloat(msg.payload.MPGtripAvg);\nmsg.payload.KPLtripAvg = parseFloat(msg.payload.KPLtripAvg);\nmsg.payload.LP100KMInstant = parseFloat(msg.payload.LP100KMInstant);\nmsg.payload.LP100KMtripAvg = parseFloat(msg.payload.LP100KMtripAvg);\nmsg.payload.tripDistanceVehicleProfile = parseFloat(msg.payload.tripDistanceVehicleProfile);\nmsg.payload.O2VoltsBank1Sensor1 = parseFloat(msg.payload.O2VoltsBank1Sensor1);\nmsg.payload.O2VoltsBank1Sensor2 = parseFloat(msg.payload.O2VoltsBank1Sensor2);\nmsg.payload.O2VoltsBank1Sensor3 = parseFloat(msg.payload.O2VoltsBank1Sensor3);\nmsg.payload.O2VoltsBank1Sensor4 = parseFloat(msg.payload.O2VoltsBank1Sensor4);\nmsg.payload.O2VoltsBank2Sensor1 = parseFloat(msg.payload.O2VoltsBank2Sensor1);\nmsg.payload.O2VoltsBank2Sensor2 = parseFloat(msg.payload.O2VoltsBank2Sensor2);\nmsg.payload.O2VoltsBank2Sensor3 = parseFloat(msg.payload.O2VoltsBank2Sensor3);\nmsg.payload.O2VoltsBank2Sensor4 = parseFloat(msg.payload.O2VoltsBank2Sensor4);\nmsg.payload.accelerationX = parseFloat(msg.payload.accelerationX);\nmsg.payload.accelerationY = parseFloat(msg.payload.accelerationY);\nmsg.payload.accelerationZ = parseFloat(msg.payload.accelerationZ);\nmsg.payload.accelerationTot = parseFloat(msg.payload.accelerationTot);\nmsg.payload.torqueCalculated = parseFloat(msg.payload.torqueCalculated);\nmsg.payload.horsepowerWheels = parseFloat(msg.payload.horsepowerWheels);\nmsg.payload.timerFrom0to60mph = parseFloat(msg.payload.timerFrom0to60mph);\nmsg.payload.timerFrom0to100kph = parseFloat(msg.payload.timerFrom0to100kph);\nmsg.payload.timerQuarterMile = parseFloat(msg.payload.timerQuarterMile);\nmsg.payload.timerEighthMile = parseFloat(msg.payload.timerEighthMile);\nmsg.payload.GPSvsOBDSpeedDiff = parseFloat(msg.payload.GPSvsOBDSpeedDiff);\nmsg.payload.voltageOBDAdapter = parseFloat(msg.payload.voltageOBDAdapter);\nmsg.payload.GPSAccuracy = parseFloat(msg.payload.GPSAccuracy);\nmsg.payload.GPSSatellites = parseFloat(msg.payload.GPSSatellites);\nmsg.payload.GPSBearing2 = parseFloat(msg.payload.GPSBearing2);\nmsg.payload.O2VoltsWideRangeSensor1 = parseFloat(msg.payload.O2VoltsWideRangeSensor1);\nmsg.payload.O2VoltsWideRangeSensor2 = parseFloat(msg.payload.O2VoltsWideRangeSensor2);\nmsg.payload.O2VoltsWideRangeSensor3 = parseFloat(msg.payload.O2VoltsWideRangeSensor3);\nmsg.payload.O2VoltsWideRangeSensor4 = parseFloat(msg.payload.O2VoltsWideRangeSensor4);\nmsg.payload.O2VoltsWideRangeSensor5 = parseFloat(msg.payload.O2VoltsWideRangeSensor5);\nmsg.payload.O2VoltsWideRangeSensor6 = parseFloat(msg.payload.O2VoltsWideRangeSensor6);\nmsg.payload.O2VoltsWideRangeSensor7 = parseFloat(msg.payload.O2VoltsWideRangeSensor7);\nmsg.payload.O2VoltsWideRangeSensor8 = parseFloat(msg.payload.O2VoltsWideRangeSensor8);\nmsg.payload.airFuelRatioMeasured = parseFloat(msg.payload.airFuelRatioMeasured);\nmsg.payload.tiltX = parseFloat(msg.payload.tiltX);\nmsg.payload.tiltY = parseFloat(msg.payload.tiltY);\nmsg.payload.tiltZ = parseFloat(msg.payload.tiltZ);\nmsg.payload.airFuelRatioCommanded = parseFloat(msg.payload.airFuelRatioCommanded);\nmsg.payload.timerFrom0to200kph = parseFloat(msg.payload.timerFrom0to200kph);\nmsg.payload.CO2Instant = parseFloat(msg.payload.CO2Instant);\nmsg.payload.CO2Avg = parseFloat(msg.payload.CO2Avg);\nmsg.payload.fuelFlowRatePerMin = parseFloat(msg.payload.fuelFlowRatePerMin);\nmsg.payload.fuelCostTrip = parseFloat(msg.payload.fuelCostTrip);\nmsg.payload.fuelFlowRatePerHour = parseFloat(msg.payload.fuelFlowRatePerHour);\nmsg.payload.timerFrom60to120mph = parseFloat(msg.payload.timerFrom60to120mph);\nmsg.payload.timerFrom60to80mph = parseFloat(msg.payload.timerFrom60to80mph);\nmsg.payload.timerFrom40to60mph = parseFloat(msg.payload.timerFrom40to60mph);\nmsg.payload.timerFrom80to100mph = parseFloat(msg.payload.timerFrom80to100mph);\nmsg.payload.tripSpeedAvgWhileMoving = parseFloat(msg.payload.tripSpeedAvgWhileMoving);\nmsg.payload.timerFrom100to0kph = parseFloat(msg.payload.timerFrom100to0kph);\nmsg.payload.timerFrom60to0mph = parseFloat(msg.payload.timerFrom60to0mph);\nmsg.payload.timerSinceJourneyStart = parseFloat(msg.payload.timerSinceJourneyStart);\nmsg.payload.timerStationary = parseFloat(msg.payload.timerStationary);\nmsg.payload.timerMoving = parseFloat(msg.payload.timerMoving);\nmsg.payload.volumetricEfficiencyCalculated = parseFloat(msg.payload.volumetricEfficiencyCalculated);\nmsg.payload.distanceToEmptyCalculated = parseFloat(msg.payload.distanceToEmptyCalculated);\nmsg.payload.fuelRemainingCalculated = parseFloat(msg.payload.fuelRemainingCalculated);\nmsg.payload.costPerMileInstant = parseFloat(msg.payload.costPerMileInstant);\nmsg.payload.costPerMileTrip = parseFloat(msg.payload.costPerMileTrip);\nmsg.payload.barometerAndroid = parseFloat(msg.payload.barometerAndroid);\nmsg.payload.fuelUsedTrip = parseFloat(msg.payload.fuelUsedTrip);\nmsg.payload.tripSpeedAvg = parseFloat(msg.payload.tripSpeedAvg);\nmsg.payload.enginekWWheels = parseFloat(msg.payload.enginekWWheels);\nmsg.payload.timerFrom80to120kph = parseFloat(msg.payload.timerFrom80to120kph);\nmsg.payload.timerFrom60to130mph = parseFloat(msg.payload.timerFrom60to130mph);\nmsg.payload.timerFrom0to30mph = parseFloat(msg.payload.timerFrom0to30mph);\nmsg.payload.exhaustGasTempBank1Sensor2 = parseFloat(msg.payload.exhaustGasTempBank1Sensor2);\nmsg.payload.exhaustGasTempBank1Sensor3 = parseFloat(msg.payload.exhaustGasTempBank1Sensor3);\nmsg.payload.exhaustGasTempBank1Sensor4 = parseFloat(msg.payload.exhaustGasTempBank1Sensor4);\nmsg.payload.exhaustGasTempBank2Sensor2 = parseFloat(msg.payload.exhaustGasTempBank2Sensor2);\nmsg.payload.exhaustGasTempBank2Sensor3 = parseFloat(msg.payload.exhaustGasTempBank2Sensor3);\nmsg.payload.exhaustGasTempBank2Sensor4 = parseFloat(msg.payload.exhaustGasTempBank2Sensor4);\nmsg.payload.NOxPostSCR = parseFloat(msg.payload.NOxPostSCR);\nmsg.payload.drivingPercentCity = parseFloat(msg.payload.drivingPercentCity);\nmsg.payload.drivingPercentHighway = parseFloat(msg.payload.drivingPercentHighway);\nmsg.payload.drivingPercentIdle = parseFloat(msg.payload.drivingPercentIdle);\nmsg.payload.batteryLevelAndroid = parseFloat(msg.payload.batteryLevelAndroid);\nmsg.payload.MPGLongTermAvg = parseFloat(msg.payload.MPGLongTermAvg);\nmsg.payload.KPLLongTermAvg = parseFloat(msg.payload.KPLLongTermAvg);\nmsg.payload.LP100KMLongTermAvg = parseFloat(msg.payload.LP100KMLongTermAvg);\nreturn msg;",
+  "outputs": 1,
+  "noerr": 0,
+  "x": 940,
+  "y": 260,
+  "wires": [
+  [
+  "f8b64b5e.e7ce"
+  ]
+  ]
+  },
+  {
+  "id": "3c83039.65050fc",
+  "type": "debug",
+  "z": "1051da59.797066",
+  "name": "",
+  "active": true,
+  "tosidebar": true,
+  "console": false,
+  "tostatus": false,
+  "complete": "payload",
+  "targetType": "msg",
+  "x": 1470,
+  "y": 300,
+  "wires": []
+  },
+  {
+  "id": "84b76083.62f398",
+  "type": "inject",
+  "z": "1051da59.797066",
+  "name": "testdata",
+  "topic": "",
+  "payload": "{\"eml\":\"torquetest\",\"v\":\"8\",\"session\":\"1559309451755\",\"id\":\"282d443464cf7afc0051c57afba43006\",\"time\":\"1559313070844\",\"kff1005\":[\"-71.089996\",\"-71.089996\"],\"kff1006\":[\"42.362714\",\"42.362714\"],\"kff1001\":[\"0.0\",\"0.0\"],\"kff1007\":\"0.0\",\"k47\":\"24.313726\",\"kff1223\":\"0.01545088\",\"kff1220\":\"-0.022440217\",\"kff1221\":\"8.1349094E-4\",\"kff1222\":\"0.91485566\",\"kff124d\":\"14.08\",\"k46\":\"27.0\",\"kff129a\":\"79.0\",\"kff1272\":\"0.0\",\"kff1270\":\"1012.35156\",\"k33\":\"104.0\",\"k3c\":\"28.699997\",\"k3d\":\"28.699997\",\"k44\":\"1.0\",\"k2c\":\"0.0\",\"k2d\":\"0.0\",\"k5\":\"29.0\",\"k4\":\"0.0\",\"k43\":\"0.0\",\"kc\":\"0.0\",\"k32\":\"-34.25\",\"k2f\":\"100.0\",\"k22\":\"100.625\",\"kff1239\":\"51.456\",\"kff1010\":\"-100.840087890625\",\"kff123b\":\"0.0\",\"kff123a\":\"2.0\",\"kff1237\":\"0.0\",\"kf\":\"40.0\",\"kb\":\"104.0\",\"k10\":\"0.0\",\"kff1201\":\"512.0\",\"k45\":\"5.882353\",\"k1f\":\"0.0\",\"kd\":\"0.0\",\"k11\":\"18.431374\",\"ke\":\"10.0\",\"kff1205\":\"0.0\",\"kff1202\":\"0.0\",\"k42\":\"12.109\",\"kff1238\":\"12.4\"}",
+  "payloadType": "json",
+  "repeat": "",
+  "crontab": "",
+  "once": false,
+  "onceDelay": 0.1,
+  "x": 190,
+  "y": 300,
+  "wires": [
+  [
+  "8b6d2f73.79c94"
+  ]
+  ]
+  },
+  {
+  "id": "19625f35.0e6039",
+  "type": "moment",
+  "z": "1051da59.797066",
+  "name": "",
+  "topic": "",
+  "input": "payload.session",
+  "inputType": "msg",
+  "inTz": "ETC/GMT",
+  "adjAmount": 0,
+  "adjType": "days",
+  "adjDir": "add",
+  "format": "LLL",
+  "locale": "POSIX",
+  "output": "payload.session",
+  "outputType": "msg",
+  "outTz": "America/New_York",
+  "x": 1280,
+  "y": 260,
+  "wires": [
+  [
+  "3c87de8f.38df52",
+  "3c83039.65050fc"
+  ]
+  ]
+  },
+  {
+  "id": "d70fbc90.23d5c",
+  "type": "change",
+  "z": "1051da59.797066",
+  "name": "Rename PIDs",
+  "rules": [
+  {
+  "t": "move",
+  "p": "payload.k10",
+  "pt": "msg",
+  "to": "payload.MAFR",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k11",
+  "pt": "msg",
+  "to": "payload.throttlePosManifold",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k12",
+  "pt": "msg",
+  "to": "payload.airStatus",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k14",
+  "pt": "msg",
+  "to": "payload.fuelTrimBank1Sensor1",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k15",
+  "pt": "msg",
+  "to": "payload.fuelTrimBank1Sensor2",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k16",
+  "pt": "msg",
+  "to": "payload.fuelTrimBank1Sensor3",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k17",
+  "pt": "msg",
+  "to": "payload.fuelTrimBank1Sensor4",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k18",
+  "pt": "msg",
+  "to": "payload.fuelTrimBank2Sensor1",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k19",
+  "pt": "msg",
+  "to": "payload.fuelTrimBank2Sensor2",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k1a",
+  "pt": "msg",
+  "to": "payload.fuelTrimBank2Sensor3",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k1b",
+  "pt": "msg",
+  "to": "payload.fuelTrimBank2Sensor4",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k1f",
+  "pt": "msg",
+  "to": "payload.runTime",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k21",
+  "pt": "msg",
+  "to": "payload.distTraveledWithCELLit",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k22",
+  "pt": "msg",
+  "to": "payload.fuelRailPressureManifoldVacuumRelative",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k23",
+  "pt": "msg",
+  "to": "payload.fuelRailPressure",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k24",
+  "pt": "msg",
+  "to": "payload.O2SensorEquivalenceRatio1",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k25",
+  "pt": "msg",
+  "to": "payload.O2SensorEquivalenceRatio2",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k26",
+  "pt": "msg",
+  "to": "payload.O2SensorEquivalenceRatio3",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k27",
+  "pt": "msg",
+  "to": "payload.O2SensorEquivalenceRatio4",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k28",
+  "pt": "msg",
+  "to": "payload.O2SensorEquivalenceRatio5",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k29",
+  "pt": "msg",
+  "to": "payload.O2SensorEquivalenceRatio6",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k2a",
+  "pt": "msg",
+  "to": "payload.O2SensorEquivalenceRatio7",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k2b",
+  "pt": "msg",
+  "to": "payload.O2SensorEquivalenceRatio8",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k2c",
+  "pt": "msg",
+  "to": "payload.EGRCommanded",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k2d",
+  "pt": "msg",
+  "to": "payload.EGRError",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k2f",
+  "pt": "msg",
+  "to": "payload.fuelLevelFromECU",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k3",
+  "pt": "msg",
+  "to": "payload.fuelStatus",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k31",
+  "pt": "msg",
+  "to": "payload.distTraveledSinceCodesCleared",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k32",
+  "pt": "msg",
+  "to": "payload.evapSysVaporPressure",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k33",
+  "pt": "msg",
+  "to": "payload.barometerVehicle",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k34",
+  "pt": "msg",
+  "to": "payload.O2SensorEquivalenceRatioAlternate1",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k3c",
+  "pt": "msg",
+  "to": "payload.catalystTempBank1Sensor1",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k3d",
+  "pt": "msg",
+  "to": "payload.catalystTempBank2Sensor1",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k3e",
+  "pt": "msg",
+  "to": "payload.catalystTempBank1Sensor2",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k3f",
+  "pt": "msg",
+  "to": "payload.catalystTempBank2Sensor2",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k4",
+  "pt": "msg",
+  "to": "payload.engineLoad",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k42",
+  "pt": "msg",
+  "to": "payload.voltageControlModule",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k43",
+  "pt": "msg",
+  "to": "payload.engineLoadAbsolute",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k44",
+  "pt": "msg",
+  "to": "payload.commandedEquivalenceRatioLambda",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k45",
+  "pt": "msg",
+  "to": "payload.throttlePositionRelative",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k46",
+  "pt": "msg",
+  "to": "payload.ambientAirTemp",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k47",
+  "pt": "msg",
+  "to": "payload.throttlePositionAbsoluteB",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k49",
+  "pt": "msg",
+  "to": "payload.acceleratorPedalPositionD",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k4a",
+  "pt": "msg",
+  "to": "payload.acceleratorPedalPositionE",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k4b",
+  "pt": "msg",
+  "to": "payload.acceleratorPedalPositionF",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k5",
+  "pt": "msg",
+  "to": "payload.engineCoolantTemp",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k5a",
+  "pt": "msg",
+  "to": "payload.acceleratorPedalPositionRelative",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k52",
+  "pt": "msg",
+  "to": "payload.ethanolFuelPercent",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k5a",
+  "pt": "msg",
+  "to": "payload.relativeAcceleratorPedalPosition",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k5b",
+  "pt": "msg",
+  "to": "payload.hybridBatteryCharge",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k5c",
+  "pt": "msg",
+  "to": "payload.engineOilTemp",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k6",
+  "pt": "msg",
+  "to": "payload.fuelTrimShortTermbank1",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k61",
+  "pt": "msg",
+  "to": "payload.torqueDemanded",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k62",
+  "pt": "msg",
+  "to": "payload.torqueActual",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k63",
+  "pt": "msg",
+  "to": "payload.torqueReference",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k7",
+  "pt": "msg",
+  "to": "payload.fuelTrimLongTermBank1",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k70",
+  "pt": "msg",
+  "to": "payload.turboPressureControl",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k73",
+  "pt": "msg",
+  "to": "payload.exhaustPressure",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k77",
+  "pt": "msg",
+  "to": "payload.chargeAirCoolerTemp",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k78",
+  "pt": "msg",
+  "to": "payload.exhaustGasTempBank1Sensor1",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k79",
+  "pt": "msg",
+  "to": "payload.exhaustGasTempBank2Sensor1",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k7a",
+  "pt": "msg",
+  "to": "payload.DPFPressure",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k7c",
+  "pt": "msg",
+  "to": "payload.DPFTemp",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k8",
+  "pt": "msg",
+  "to": "payload.fuelTrimShortTermBank2",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k83",
+  "pt": "msg",
+  "to": "payload.NOxPreSCR",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k9",
+  "pt": "msg",
+  "to": "payload.fuelTrimLongTermBank2",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.ka",
+  "pt": "msg",
+  "to": "payload.fuelPressure",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kb",
+  "pt": "msg",
+  "to": "payload.intakeManifoldPressure",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kb4",
+  "pt": "msg",
+  "to": "payload.transmissionTempMethod2",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kc",
+  "pt": "msg",
+  "to": "payload.engineRPM",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kd",
+  "pt": "msg",
+  "to": "payload.speedOBD",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.ke",
+  "pt": "msg",
+  "to": "payload.timingAdvance",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kf",
+  "pt": "msg",
+  "to": "payload.intakeAirTemp",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kfe1805",
+  "pt": "msg",
+  "to": "payload.transmissionTempMethod1",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1001",
+  "pt": "msg",
+  "to": "payload.GPSSpeed",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1005",
+  "pt": "msg",
+  "to": "payload.GPSLongitude",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1006",
+  "pt": "msg",
+  "to": "payload.GPSLatitude",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1007",
+  "pt": "msg",
+  "to": "payload.GPSBearing1",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1010",
+  "pt": "msg",
+  "to": "payload.GPSAltitude",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1201",
+  "pt": "msg",
+  "to": "payload.MPGInstant",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1202",
+  "pt": "msg",
+  "to": "payload.turboBoostandVac",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1203",
+  "pt": "msg",
+  "to": "payload.KPLInstant",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1204",
+  "pt": "msg",
+  "to": "payload.tripDistance",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1205",
+  "pt": "msg",
+  "to": "payload.MPGtripAvg",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1206",
+  "pt": "msg",
+  "to": "payload.KPLtripAvg",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1207",
+  "pt": "msg",
+  "to": "payload.LP100KMInstant",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1208",
+  "pt": "msg",
+  "to": "payload.LP100KMtripAvg",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff120c",
+  "pt": "msg",
+  "to": "payload.tripDistanceVehicleProfile",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1214",
+  "pt": "msg",
+  "to": "payload.O2VoltsBank1Sensor1",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1215",
+  "pt": "msg",
+  "to": "payload.O2VoltsBank1Sensor2",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1216",
+  "pt": "msg",
+  "to": "payload.O2VoltsBank1Sensor3",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1217",
+  "pt": "msg",
+  "to": "payload.O2VoltsBank1Sensor4",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1218",
+  "pt": "msg",
+  "to": "payload.O2VoltsBank2Sensor1",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1219",
+  "pt": "msg",
+  "to": "payload.O2VoltsBank2Sensor2",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff121a",
+  "pt": "msg",
+  "to": "payload.O2VoltsBank2Sensor3",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff121b",
+  "pt": "msg",
+  "to": "payload.O2VoltsBank2Sensor4",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1220",
+  "pt": "msg",
+  "to": "payload.accelerationX",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1221",
+  "pt": "msg",
+  "to": "payload.accelerationY",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1222",
+  "pt": "msg",
+  "to": "payload.accelerationZ",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1223",
+  "pt": "msg",
+  "to": "payload.accelerationTot",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1225",
+  "pt": "msg",
+  "to": "payload.torqueCalculated",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1226",
+  "pt": "msg",
+  "to": "payload.horsepowerWheels",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff122d",
+  "pt": "msg",
+  "to": "payload.timerFrom0to60mph",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff122e",
+  "pt": "msg",
+  "to": "payload.timerFrom0to100kph",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff122f",
+  "pt": "msg",
+  "to": "payload.timerQuarterMile",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1230",
+  "pt": "msg",
+  "to": "payload.timerEighthMile",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1237",
+  "pt": "msg",
+  "to": "payload.GPSvsOBDSpeedDiff",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1238",
+  "pt": "msg",
+  "to": "payload.voltageOBDAdapter",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1239",
+  "pt": "msg",
+  "to": "payload.GPSAccuracy",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff123a",
+  "pt": "msg",
+  "to": "payload.GPSSatellites",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff123b",
+  "pt": "msg",
+  "to": "payload.GPSBearing2",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1240",
+  "pt": "msg",
+  "to": "payload.O2VoltsWideRangeSensor1",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1241",
+  "pt": "msg",
+  "to": "payload.O2VoltsWideRangeSensor2",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1242",
+  "pt": "msg",
+  "to": "payload.O2VoltsWideRangeSensor3",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1243",
+  "pt": "msg",
+  "to": "payload.O2VoltsWideRangeSensor4",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1244",
+  "pt": "msg",
+  "to": "payload.O2VoltsWideRangeSensor5",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1245",
+  "pt": "msg",
+  "to": "payload.O2VoltsWideRangeSensor6",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1246",
+  "pt": "msg",
+  "to": "payload.O2VoltsWideRangeSensor7",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1247",
+  "pt": "msg",
+  "to": "payload.O2VoltsWideRangeSensor8",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1249",
+  "pt": "msg",
+  "to": "payload.airFuelRatioMeasured",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff124a",
+  "pt": "msg",
+  "to": "payload.tiltX",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff124b",
+  "pt": "msg",
+  "to": "payload.tiltY",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff124c",
+  "pt": "msg",
+  "to": "payload.tiltZ",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff124d",
+  "pt": "msg",
+  "to": "payload.airFuelRatioCommanded",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff124f",
+  "pt": "msg",
+  "to": "payload.timerFrom0to200kph",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1257",
+  "pt": "msg",
+  "to": "payload.CO2Instant",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1258",
+  "pt": "msg",
+  "to": "payload.CO2Avg",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff125a",
+  "pt": "msg",
+  "to": "payload.fuelFlowRatePerMin",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff125c",
+  "pt": "msg",
+  "to": "payload.fuelCostTrip",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff125d",
+  "pt": "msg",
+  "to": "payload.fuelFlowRatePerHour",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff125e",
+  "pt": "msg",
+  "to": "payload.timerFrom60to120mph",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff125f",
+  "pt": "msg",
+  "to": "payload.timerFrom60to80mph",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1260",
+  "pt": "msg",
+  "to": "payload.timerFrom40to60mph",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1261",
+  "pt": "msg",
+  "to": "payload.timerFrom80to100mph",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1263",
+  "pt": "msg",
+  "to": "payload.tripSpeedAvgWhileMoving",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1264",
+  "pt": "msg",
+  "to": "payload.timerFrom100to0kph",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1265",
+  "pt": "msg",
+  "to": "payload.timerFrom60to0mph",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1266",
+  "pt": "msg",
+  "to": "payload.timerSinceJourneyStart",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1267",
+  "pt": "msg",
+  "to": "payload.timerStationary",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1268",
+  "pt": "msg",
+  "to": "payload.timerMoving",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1269",
+  "pt": "msg",
+  "to": "payload.volumetricEfficiencyCalculated",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff126a",
+  "pt": "msg",
+  "to": "payload.distanceToEmptyCalculated",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff126b",
+  "pt": "msg",
+  "to": "payload.fuelRemainingCalculated",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff126d",
+  "pt": "msg",
+  "to": "payload.costPerMileInstant",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff126e",
+  "pt": "msg",
+  "to": "payload.costPerMileTrip",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1270",
+  "pt": "msg",
+  "to": "payload.barometerAndroid",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1271",
+  "pt": "msg",
+  "to": "payload.fuelUsedTrip",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1272",
+  "pt": "msg",
+  "to": "payload.tripSpeedAvg",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1273",
+  "pt": "msg",
+  "to": "payload.enginekWWheels",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1275",
+  "pt": "msg",
+  "to": "payload.timerFrom80to120kph",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1276",
+  "pt": "msg",
+  "to": "payload.timerFrom60to130mph",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff1277",
+  "pt": "msg",
+  "to": "payload.timerFrom0to30mph",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k1282",
+  "pt": "msg",
+  "to": "payload.exhaustGasTempBank1Sensor2",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k1283",
+  "pt": "msg",
+  "to": "payload.exhaustGasTempBank1Sensor3",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k1284",
+  "pt": "msg",
+  "to": "payload.exhaustGasTempBank1Sensor4",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k1286",
+  "pt": "msg",
+  "to": "payload.exhaustGasTempBank2Sensor2",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k1287",
+  "pt": "msg",
+  "to": "payload.exhaustGasTempBank2Sensor3",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k1288",
+  "pt": "msg",
+  "to": "payload.exhaustGasTempBank2Sensor4",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k128a",
+  "pt": "msg",
+  "to": "payload.NOxPostSCR",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k1296",
+  "pt": "msg",
+  "to": "payload.drivingPercentCity",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k1297",
+  "pt": "msg",
+  "to": "payload.drivingPercentHighway",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.k1298",
+  "pt": "msg",
+  "to": "payload.drivingPercentIdle",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff129a",
+  "pt": "msg",
+  "to": "payload.batteryLevelAndroid",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff5201",
+  "pt": "msg",
+  "to": "payload.MPGLongTermAvg",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff5202",
+  "pt": "msg",
+  "to": "payload.KPLLongTermAvg",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.kff5203",
+  "pt": "msg",
+  "to": "payload.LP100KMLongTermAvg",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.v",
+  "pt": "msg",
+  "to": "payload.appVersion",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.id",
+  "pt": "msg",
+  "to": "payload.appID_MD5",
+  "tot": "msg"
+  },
+  {
+  "t": "move",
+  "p": "payload.eml",
+  "pt": "msg",
+  "to": "payload.appID_userEntered",
+  "tot": "msg"
+  }
+  ],
+  "action": "",
+  "property": "",
+  "from": "",
+  "to": "",
+  "reg": false,
+  "x": 580,
+  "y": 260,
+  "wires": [
+  [
+  "861b3377.410e3"
+  ]
+  ]
+  },
+  {
+  "id": "3c87de8f.38df52",
+  "type": "change",
+  "z": "1051da59.797066",
+  "name": "",
+  "rules": [
+  {
+  "t": "set",
+  "p": "topic",
+  "pt": "msg",
+  "to": "torque/formatted",
+  "tot": "str"
+  }
+  ],
+  "action": "",
+  "property": "",
+  "from": "",
+  "to": "",
+  "reg": false,
+  "x": 1470,
+  "y": 260,
+  "wires": [
+  [
+  "ffec7c10.fa3d6"
+  ]
+  ]
+  },
+  {
+  "id": "f8b64b5e.e7ce",
+  "type": "function",
+  "z": "1051da59.797066",
+  "name": "remove nulls",
+  "func": "//Object.keys(msg.payload).forEach((k) => (!msg.payload[k] && msg.payload[k] !== undefined) && delete msg.payload[k]);\n\n\nfor (var propName in msg.payload)\n{ \n    if (msg.payload[propName] === null || msg.payload[propName] === undefined || (isNaN(msg.payload[propName] && typeof msg.payload[propName] !== 'string')))\n    {\n      delete msg.payload[propName];\n    }\n}\nreturn msg;",
+  "outputs": 1,
+  "noerr": 0,
+  "x": 1090,
+  "y": 260,
+  "wires": [
+  [
+  "19625f35.0e6039"
+  ]
+  ]
+  },
+  {
+  "id": "cf272a44.fc08b",
+  "type": "delay",
+  "z": "1051da59.797066",
+  "name": "",
+  "pauseType": "rate",
+  "timeout": "5",
+  "timeoutUnits": "seconds",
+  "rate": "1",
+  "nbRateUnits": "1",
+  "rateUnits": "second",
+  "randomFirst": "1",
+  "randomLast": "5",
+  "randomUnits": "seconds",
+  "drop": true,
+  "x": 190,
+  "y": 100,
+  "wires": [
+  [
+  "d3c7f0f6.360e",
+  "b043ff20.449ac8",
+  "8b6d2f73.79c94"
+  ]
+  ]
+  },
+  {
+  "id": "861b3377.410e3",
+  "type": "function",
+  "z": "1051da59.797066",
+  "name": "set default ID",
+  "func": "if (msg.payload.appID_userEntered === undefined)\n{\n   msg.payload.appID_userEntered = 'liteVersion'; \n}\nreturn msg;",
+  "outputs": 1,
+  "noerr": 0,
+  "x": 780,
+  "y": 260,
+  "wires": [
+  [
+  "52b74919.1194b8"
+  ]
+  ]
+  },
+  {
+  "id": "56a849d2.194a68",
+  "type": "mqtt-broker",
+  "z": "",
+  "name": "Mosquitto",
+  "broker": "host",
+  "port": "port",
+  "tls": "9f91046e.e850e8",
+  "clientid": "node-red",
+  "usetls": false,
+  "compatmode": true,
+  "keepalive": "60",
+  "cleansession": true,
+  "birthTopic": "",
+  "birthQos": "0",
+  "birthPayload": "",
+  "closeTopic": "",
+  "closeQos": "0",
+  "closePayload": "",
+  "willTopic": "",
+  "willQos": "0",
+  "willPayload": ""
+  },
+  {
+  "id": "9f91046e.e850e8",
+  "type": "tls-config",
+  "z": "",
+  "name": "",
+  "cert": "",
+  "key": "",
+  "ca": "",
+  "certname": "",
+  "keyname": "",
+  "caname": "",
+  "servername": "",
+  "verifyservercert": true
+  }
+  ]




diff --git a/grafana/torque/grafana-torque.json b/grafana/torque/grafana-torque.json
new file mode 100644
index 0000000000000000000000000000000000000000..98a130d5c1a01d9115e90fbd2b447b84c6add989
--- /dev/null
+++ b/grafana/torque/grafana-torque.json
@@ -0,0 +1,2216 @@
+{

+  "annotations": {

+    "list": [

+      {

+        "builtIn": 1,

+        "datasource": "-- Grafana --",

+        "enable": true,

+        "hide": true,

+        "iconColor": "rgba(0, 211, 255, 1)",

+        "name": "Annotations & Alerts",

+        "type": "dashboard"

+      }

+    ]

+  },

+  "editable": true,

+  "gnetId": null,

+  "graphTooltip": 0,

+  "id": 22,

+  "links": [],

+  "panels": [

+    {

+      "cacheTimeout": null,

+      "colorBackground": false,

+      "colorPostfix": true,

+      "colorPrefix": false,

+      "colorValue": true,

+      "colors": [

+        "#d44a3a",

+        "rgba(237, 129, 40, 0.89)",

+        "#299c46"

+      ],

+      "datasource": null,

+      "decimals": 0,

+      "format": "none",

+      "gauge": {

+        "maxValue": 100,

+        "minValue": 0,

+        "show": false,

+        "thresholdLabels": false,

+        "thresholdMarkers": true

+      },

+      "gridPos": {

+        "h": 5,

+        "w": 3,

+        "x": 0,

+        "y": 0

+      },

+      "id": 15,

+      "interval": null,

+      "links": [],

+      "mappingType": 1,

+      "mappingTypes": [

+        {

+          "name": "value to text",

+          "value": 1

+        },

+        {

+          "name": "range to text",

+          "value": 2

+        }

+      ],

+      "maxDataPoints": 100,

+      "nullPointMode": "connected",

+      "nullText": null,

+      "options": {},

+      "pluginVersion": "6.4.3",

+      "postfix": "  MPG",

+      "postfixFontSize": "80%",

+      "prefix": "",

+      "prefixFontSize": "50%",

+      "rangeMaps": [

+        {

+          "from": "null",

+          "text": "N/A",

+          "to": "null"

+        }

+      ],

+      "sparkline": {

+        "fillColor": "rgba(31, 118, 189, 0.18)",

+        "full": false,

+        "lineColor": "rgb(31, 120, 193)",

+        "show": true,

+        "ymax": null,

+        "ymin": null

+      },

+      "tableColumn": "",

+      "targets": [

+        {

+          "groupBy": [],

+          "measurement": "/^$Car$/",

+          "orderByTime": "ASC",

+          "policy": "default",

+          "refId": "A",

+          "resultFormat": "table",

+          "select": [

+            [

+              {

+                "params": [

+                  "MPGLongTermAvg"

+                ],

+                "type": "field"

+              }

+            ]

+          ],

+          "tags": []

+        }

+      ],

+      "thresholds": "20,30",

+      "timeFrom": null,

+      "timeShift": null,

+      "title": "Average MPG",

+      "type": "singlestat",

+      "valueFontSize": "80%",

+      "valueMaps": [

+        {

+          "op": "=",

+          "text": "N/A",

+          "value": "null"

+        }

+      ],

+      "valueName": "avg"

+    },

+    {

+      "cacheTimeout": null,

+      "colorBackground": false,

+      "colorPostfix": true,

+      "colorPrefix": false,

+      "colorValue": true,

+      "colors": [

+        "#d44a3a",

+        "rgba(237, 129, 40, 0.89)",

+        "#299c46"

+      ],

+      "datasource": null,

+      "decimals": 0,

+      "format": "none",

+      "gauge": {

+        "maxValue": 100,

+        "minValue": 0,

+        "show": false,

+        "thresholdLabels": false,

+        "thresholdMarkers": true

+      },

+      "gridPos": {

+        "h": 5,

+        "w": 3,

+        "x": 3,

+        "y": 0

+      },

+      "id": 22,

+      "interval": null,

+      "links": [],

+      "mappingType": 1,

+      "mappingTypes": [

+        {

+          "name": "value to text",

+          "value": 1

+        },

+        {

+          "name": "range to text",

+          "value": 2

+        }

+      ],

+      "maxDataPoints": 100,

+      "nullPointMode": "connected",

+      "nullText": null,

+      "options": {},

+      "postfix": " MPG",

+      "postfixFontSize": "80%",

+      "prefix": "",

+      "prefixFontSize": "50%",

+      "rangeMaps": [

+        {

+          "from": "null",

+          "text": "N/A",

+          "to": "null"

+        }

+      ],

+      "sparkline": {

+        "fillColor": "rgba(31, 118, 189, 0.18)",

+        "full": false,

+        "lineColor": "rgb(31, 120, 193)",

+        "show": true,

+        "ymax": null,

+        "ymin": null

+      },

+      "tableColumn": "",

+      "targets": [

+        {

+          "groupBy": [

+            {

+              "params": [

+                "$__interval"

+              ],

+              "type": "time"

+            },

+            {

+              "params": [

+                "null"

+              ],

+              "type": "fill"

+            }

+          ],

+          "measurement": "/^$Car$/",

+          "orderByTime": "ASC",

+          "policy": "default",

+          "refId": "A",

+          "resultFormat": "time_series",

+          "select": [

+            [

+              {

+                "params": [

+                  "MPGtripAvg"

+                ],

+                "type": "field"

+              },

+              {

+                "params": [],

+                "type": "mean"

+              }

+            ]

+          ],

+          "tags": []

+        }

+      ],

+      "thresholds": "20,30",

+      "timeFrom": null,

+      "timeShift": null,

+      "title": "MPG Trip Avg",

+      "type": "singlestat",

+      "valueFontSize": "80%",

+      "valueMaps": [

+        {

+          "op": "=",

+          "text": "N/A",

+          "value": "null"

+        }

+      ],

+      "valueName": "avg"

+    },

+    {

+      "cacheTimeout": null,

+      "colorBackground": false,

+      "colorPostfix": true,

+      "colorPrefix": false,

+      "colorValue": true,

+      "colors": [

+        "#d44a3a",

+        "rgba(237, 129, 40, 0.89)",

+        "#299c46"

+      ],

+      "datasource": null,

+      "decimals": 0,

+      "format": "none",

+      "gauge": {

+        "maxValue": 100,

+        "minValue": 0,

+        "show": false,

+        "thresholdLabels": false,

+        "thresholdMarkers": true

+      },

+      "gridPos": {

+        "h": 5,

+        "w": 3,

+        "x": 6,

+        "y": 0

+      },

+      "id": 13,

+      "interval": null,

+      "links": [],

+      "mappingType": 1,

+      "mappingTypes": [

+        {

+          "name": "value to text",

+          "value": 1

+        },

+        {

+          "name": "range to text",

+          "value": 2

+        }

+      ],

+      "maxDataPoints": 100,

+      "nullPointMode": "connected",

+      "nullText": null,

+      "options": {},

+      "postfix": " MPH",

+      "postfixFontSize": "80%",

+      "prefix": "",

+      "prefixFontSize": "50%",

+      "rangeMaps": [

+        {

+          "from": "null",

+          "text": "N/A",

+          "to": "null"

+        }

+      ],

+      "sparkline": {

+        "fillColor": "rgba(31, 118, 189, 0.18)",

+        "full": false,

+        "lineColor": "rgb(31, 120, 193)",

+        "show": true,

+        "ymax": null,

+        "ymin": null

+      },

+      "tableColumn": "",

+      "targets": [

+        {

+          "groupBy": [

+            {

+              "params": [

+                "$__interval"

+              ],

+              "type": "time"

+            },

+            {

+              "params": [

+                "null"

+              ],

+              "type": "fill"

+            }

+          ],

+          "measurement": "/^$Car$/",

+          "orderByTime": "ASC",

+          "policy": "default",

+          "refId": "A",

+          "resultFormat": "time_series",

+          "select": [

+            [

+              {

+                "params": [

+                  "GPSSpeed"

+                ],

+                "type": "field"

+              },

+              {

+                "params": [],

+                "type": "mean"

+              }

+            ]

+          ],

+          "tags": []

+        }

+      ],

+      "thresholds": "35,60",

+      "timeFrom": null,

+      "timeShift": null,

+      "title": "Average Speed",

+      "type": "singlestat",

+      "valueFontSize": "80%",

+      "valueMaps": [

+        {

+          "op": "=",

+          "text": "N/A",

+          "value": "null"

+        }

+      ],

+      "valueName": "avg"

+    },

+    {

+      "cacheTimeout": null,

+      "colorBackground": false,

+      "colorPostfix": true,

+      "colorPrefix": false,

+      "colorValue": true,

+      "colors": [

+        "#d44a3a",

+        "rgba(237, 129, 40, 0.89)",

+        "#299c46"

+      ],

+      "datasource": null,

+      "decimals": 0,

+      "format": "none",

+      "gauge": {

+        "maxValue": 100,

+        "minValue": 0,

+        "show": false,

+        "thresholdLabels": false,

+        "thresholdMarkers": true

+      },

+      "gridPos": {

+        "h": 5,

+        "w": 3,

+        "x": 9,

+        "y": 0

+      },

+      "id": 14,

+      "interval": null,

+      "links": [],

+      "mappingType": 1,

+      "mappingTypes": [

+        {

+          "name": "value to text",

+          "value": 1

+        },

+        {

+          "name": "range to text",

+          "value": 2

+        }

+      ],

+      "maxDataPoints": 100,

+      "nullPointMode": "connected",

+      "nullText": null,

+      "options": {},

+      "postfix": " Miles",

+      "postfixFontSize": "80%",

+      "prefix": "",

+      "prefixFontSize": "50%",

+      "rangeMaps": [

+        {

+          "from": "null",

+          "text": "N/A",

+          "to": "null"

+        }

+      ],

+      "sparkline": {

+        "fillColor": "rgba(31, 118, 189, 0.18)",

+        "full": false,

+        "lineColor": "rgb(31, 120, 193)",

+        "show": true,

+        "ymax": null,

+        "ymin": null

+      },

+      "tableColumn": "",

+      "targets": [

+        {

+          "groupBy": [

+            {

+              "params": [

+                "$__interval"

+              ],

+              "type": "time"

+            },

+            {

+              "params": [

+                "null"

+              ],

+              "type": "fill"

+            }

+          ],

+          "measurement": "/^$Car$/",

+          "orderByTime": "ASC",

+          "policy": "default",

+          "refId": "A",

+          "resultFormat": "time_series",

+          "select": [

+            [

+              {

+                "params": [

+                  "tripDistance"

+                ],

+                "type": "field"

+              },

+              {

+                "params": [],

+                "type": "mean"

+              }

+            ]

+          ],

+          "tags": []

+        }

+      ],

+      "thresholds": "35,60",

+      "timeFrom": null,

+      "timeShift": null,

+      "title": "Average Trip Distance",

+      "type": "singlestat",

+      "valueFontSize": "80%",

+      "valueMaps": [

+        {

+          "op": "=",

+          "text": "N/A",

+          "value": "null"

+        }

+      ],

+      "valueName": "avg"

+    },

+    {

+      "cacheTimeout": null,

+      "colorBackground": false,

+      "colorPostfix": true,

+      "colorPrefix": false,

+      "colorValue": true,

+      "colors": [

+        "#299c46",

+        "rgba(237, 129, 40, 0.89)",

+        "#d44a3a"

+      ],

+      "datasource": null,

+      "decimals": 0,

+      "format": "s",

+      "gauge": {

+        "maxValue": 100,

+        "minValue": 0,

+        "show": false,

+        "thresholdLabels": false,

+        "thresholdMarkers": true

+      },

+      "gridPos": {

+        "h": 5,

+        "w": 3,

+        "x": 12,

+        "y": 0

+      },

+      "id": 24,

+      "interval": null,

+      "links": [],

+      "mappingType": 1,

+      "mappingTypes": [

+        {

+          "name": "value to text",

+          "value": 1

+        },

+        {

+          "name": "range to text",

+          "value": 2

+        }

+      ],

+      "maxDataPoints": 100,

+      "nullPointMode": "connected",

+      "nullText": null,

+      "options": {},

+      "postfix": "",

+      "postfixFontSize": "80%",

+      "prefix": "",

+      "prefixFontSize": "50%",

+      "rangeMaps": [

+        {

+          "from": "null",

+          "text": "N/A",

+          "to": "null"

+        }

+      ],

+      "sparkline": {

+        "fillColor": "rgba(31, 118, 189, 0.18)",

+        "full": false,

+        "lineColor": "rgb(31, 120, 193)",

+        "show": true,

+        "ymax": null,

+        "ymin": null

+      },

+      "tableColumn": "",

+      "targets": [

+        {

+          "groupBy": [

+            {

+              "params": [

+                "$__interval"

+              ],

+              "type": "time"

+            },

+            {

+              "params": [

+                "null"

+              ],

+              "type": "fill"

+            }

+          ],

+          "measurement": "/^$Car$/",

+          "orderByTime": "ASC",

+          "policy": "default",

+          "refId": "A",

+          "resultFormat": "time_series",

+          "select": [

+            [

+              {

+                "params": [

+                  "runTime"

+                ],

+                "type": "field"

+              },

+              {

+                "params": [],

+                "type": "mean"

+              }

+            ]

+          ],

+          "tags": []

+        }

+      ],

+      "thresholds": "35,60",

+      "timeFrom": null,

+      "timeShift": null,

+      "title": "Last Trip Time",

+      "type": "singlestat",

+      "valueFontSize": "80%",

+      "valueMaps": [

+        {

+          "op": "=",

+          "text": "N/A",

+          "value": "null"

+        }

+      ],

+      "valueName": "current"

+    },

+    {

+      "cacheTimeout": null,

+      "colorBackground": false,

+      "colorPostfix": true,

+      "colorPrefix": false,

+      "colorValue": true,

+      "colors": [

+        "#299c46",

+        "rgba(237, 129, 40, 0.89)",

+        "#d44a3a"

+      ],

+      "datasource": null,

+      "decimals": 0,

+      "format": "none",

+      "gauge": {

+        "maxValue": 100,

+        "minValue": 0,

+        "show": false,

+        "thresholdLabels": false,

+        "thresholdMarkers": true

+      },

+      "gridPos": {

+        "h": 5,

+        "w": 3,

+        "x": 15,

+        "y": 0

+      },

+      "id": 12,

+      "interval": null,

+      "links": [],

+      "mappingType": 1,

+      "mappingTypes": [

+        {

+          "name": "value to text",

+          "value": 1

+        },

+        {

+          "name": "range to text",

+          "value": 2

+        }

+      ],

+      "maxDataPoints": 100,

+      "nullPointMode": "connected",

+      "nullText": null,

+      "options": {},

+      "postfix": " Fixed",

+      "postfixFontSize": "80%",

+      "prefix": "",

+      "prefixFontSize": "50%",

+      "rangeMaps": [

+        {

+          "from": "null",

+          "text": "N/A",

+          "to": "null"

+        }

+      ],

+      "sparkline": {

+        "fillColor": "rgba(31, 118, 189, 0.18)",

+        "full": false,

+        "lineColor": "rgb(31, 120, 193)",

+        "show": true,

+        "ymax": null,

+        "ymin": null

+      },

+      "tableColumn": "",

+      "targets": [

+        {

+          "groupBy": [

+            {

+              "params": [

+                "$__interval"

+              ],

+              "type": "time"

+            },

+            {

+              "params": [

+                "null"

+              ],

+              "type": "fill"

+            }

+          ],

+          "measurement": "/^$Car$/",

+          "orderByTime": "ASC",

+          "policy": "default",

+          "refId": "A",

+          "resultFormat": "time_series",

+          "select": [

+            [

+              {

+                "params": [

+                  "GPSSatellites"

+                ],

+                "type": "field"

+              },

+              {

+                "params": [],

+                "type": "mean"

+              }

+            ]

+          ],

+          "tags": []

+        }

+      ],

+      "thresholds": "0,10,20,30",

+      "timeFrom": null,

+      "timeShift": null,

+      "title": "GPS Satellites",

+      "type": "singlestat",

+      "valueFontSize": "80%",

+      "valueMaps": [

+        {

+          "op": "=",

+          "text": "N/A",

+          "value": "null"

+        }

+      ],

+      "valueName": "avg"

+    },

+    {

+      "cacheTimeout": null,

+      "colorBackground": false,

+      "colorPostfix": true,

+      "colorPrefix": false,

+      "colorValue": true,

+      "colors": [

+        "#299c46",

+        "rgba(237, 129, 40, 0.89)",

+        "#d44a3a"

+      ],

+      "datasource": null,

+      "format": "none",

+      "gauge": {

+        "maxValue": 100,

+        "minValue": 0,

+        "show": false,

+        "thresholdLabels": false,

+        "thresholdMarkers": true

+      },

+      "gridPos": {

+        "h": 5,

+        "w": 3,

+        "x": 18,

+        "y": 0

+      },

+      "id": 11,

+      "interval": null,

+      "links": [],

+      "mappingType": 1,

+      "mappingTypes": [

+        {

+          "name": "value to text",

+          "value": 1

+        },

+        {

+          "name": "range to text",

+          "value": 2

+        }

+      ],

+      "maxDataPoints": 100,

+      "nullPointMode": "connected",

+      "nullText": null,

+      "options": {},

+      "postfix": " Meters",

+      "postfixFontSize": "80%",

+      "prefix": "",

+      "prefixFontSize": "50%",

+      "rangeMaps": [

+        {

+          "from": "null",

+          "text": "N/A",

+          "to": "null"

+        }

+      ],

+      "sparkline": {

+        "fillColor": "rgba(31, 118, 189, 0.18)",

+        "full": false,

+        "lineColor": "rgb(31, 120, 193)",

+        "show": true,

+        "ymax": null,

+        "ymin": null

+      },

+      "tableColumn": "",

+      "targets": [

+        {

+          "groupBy": [

+            {

+              "params": [

+                "$__interval"

+              ],

+              "type": "time"

+            },

+            {

+              "params": [

+                "null"

+              ],

+              "type": "fill"

+            }

+          ],

+          "measurement": "/^$Car$/",

+          "orderByTime": "ASC",

+          "policy": "default",

+          "refId": "A",

+          "resultFormat": "time_series",

+          "select": [

+            [

+              {

+                "params": [

+                  "GPSAccuracy"

+                ],

+                "type": "field"

+              },

+              {

+                "params": [],

+                "type": "mean"

+              }

+            ]

+          ],

+          "tags": []

+        }

+      ],

+      "thresholds": "0,25,50",

+      "timeFrom": null,

+      "timeShift": null,

+      "title": "GPS Accuracy",

+      "type": "singlestat",

+      "valueFontSize": "80%",

+      "valueMaps": [

+        {

+          "op": "=",

+          "text": "N/A",

+          "value": "null"

+        }

+      ],

+      "valueName": "avg"

+    },

+    {

+      "cacheTimeout": null,

+      "datasource": null,

+      "gridPos": {

+        "h": 5,

+        "w": 3,

+        "x": 21,

+        "y": 0

+      },

+      "id": 16,

+      "links": [],

+      "options": {

+        "fieldOptions": {

+          "calcs": [

+            "lastNotNull"

+          ],

+          "defaults": {

+            "decimals": 0,

+            "mappings": [

+              {

+                "id": 0,

+                "op": "=",

+                "text": "N/A",

+                "type": 1,

+                "value": "null"

+              }

+            ],

+            "max": 100,

+            "min": 0,

+            "nullValueMode": "connected",

+            "thresholds": [

+              {

+                "color": "#d44a3a",

+                "value": null

+              },

+              {

+                "color": "rgba(237, 129, 40, 0.89)",

+                "value": 50

+              },

+              {

+                "color": "#299c46",

+                "value": 75

+              }

+            ],

+            "unit": "none"

+          },

+          "override": {},

+          "values": false

+        },

+        "orientation": "horizontal",

+        "showThresholdLabels": false,

+        "showThresholdMarkers": true

+      },

+      "pluginVersion": "6.4.3",

+      "targets": [

+        {

+          "groupBy": [

+            {

+              "params": [

+                "$__interval"

+              ],

+              "type": "time"

+            },

+            {

+              "params": [

+                "null"

+              ],

+              "type": "fill"

+            }

+          ],

+          "measurement": "/^$Car$/",

+          "orderByTime": "ASC",

+          "policy": "default",

+          "refId": "A",

+          "resultFormat": "time_series",

+          "select": [

+            [

+              {

+                "params": [

+                  "batteryLevelAndroid"

+                ],

+                "type": "field"

+              },

+              {

+                "params": [],

+                "type": "mean"

+              }

+            ]

+          ],

+          "tags": []

+        }

+      ],

+      "timeFrom": null,

+      "timeShift": null,

+      "title": "Phone Charge",

+      "type": "gauge"

+    },

+    {

+      "aliasColors": {},

+      "bars": false,

+      "dashLength": 10,

+      "dashes": false,

+      "datasource": null,

+      "fill": 1,

+      "fillGradient": 0,

+      "gridPos": {

+        "h": 7,

+        "w": 24,

+        "x": 0,

+        "y": 5

+      },

+      "id": 25,

+      "interval": "",

+      "legend": {

+        "alignAsTable": true,

+        "avg": true,

+        "current": false,

+        "max": true,

+        "min": true,

+        "rightSide": true,

+        "show": true,

+        "total": false,

+        "values": true

+      },

+      "lines": true,

+      "linewidth": 1,

+      "nullPointMode": "null",

+      "options": {

+        "dataLinks": []

+      },

+      "percentage": false,

+      "pointradius": 2,

+      "points": false,

+      "renderer": "flot",

+      "seriesOverrides": [

+        {

+          "alias": "Speed (GPS)",

+          "color": "#C4162A",

+          "transform": "negative-Y"

+        }

+      ],

+      "spaceLength": 10,

+      "stack": false,

+      "steppedLine": false,

+      "targets": [

+        {

+          "alias": "$col",

+          "groupBy": [

+            {

+              "params": [

+                "$__interval"

+              ],

+              "type": "time"

+            },

+            {

+              "params": [

+                "none"

+              ],

+              "type": "fill"

+            }

+          ],

+          "measurement": "/^$Car$/",

+          "orderByTime": "ASC",

+          "policy": "default",

+          "refId": "A",

+          "resultFormat": "time_series",

+          "select": [

+            [

+              {

+                "params": [

+                  "throttlePositionRelative"

+                ],

+                "type": "field"

+              },

+              {

+                "params": [],

+                "type": "mean"

+              },

+              {

+                "params": [

+                  "Throtlle Position"

+                ],

+                "type": "alias"

+              }

+            ]

+          ],

+          "tags": []

+        },

+        {

+          "alias": "$col",

+          "groupBy": [

+            {

+              "params": [

+                "$__interval"

+              ],

+              "type": "time"

+            },

+            {

+              "params": [

+                "none"

+              ],

+              "type": "fill"

+            }

+          ],

+          "measurement": "/^$Car$/",

+          "orderByTime": "ASC",

+          "policy": "default",

+          "refId": "B",

+          "resultFormat": "time_series",

+          "select": [

+            [

+              {

+                "params": [

+                  "GPSSpeed"

+                ],

+                "type": "field"

+              },

+              {

+                "params": [],

+                "type": "mean"

+              },

+              {

+                "params": [

+                  "Speed (GPS)"

+                ],

+                "type": "alias"

+              }

+            ]

+          ],

+          "tags": []

+        },

+        {

+          "alias": "$col",

+          "groupBy": [

+            {

+              "params": [

+                "$__interval"

+              ],

+              "type": "time"

+            },

+            {

+              "params": [

+                "none"

+              ],

+              "type": "fill"

+            }

+          ],

+          "measurement": "/^$Car$/",

+          "orderByTime": "ASC",

+          "policy": "default",

+          "refId": "C",

+          "resultFormat": "time_series",

+          "select": [

+            [

+              {

+                "params": [

+                  "MPGInstant"

+                ],

+                "type": "field"

+              },

+              {

+                "params": [],

+                "type": "mean"

+              },

+              {

+                "params": [

+                  "MPG"

+                ],

+                "type": "alias"

+              }

+            ]

+          ],

+          "tags": []

+        }

+      ],

+      "thresholds": [],

+      "timeFrom": null,

+      "timeRegions": [],

+      "timeShift": null,

+      "title": "MPG v Speed",

+      "tooltip": {

+        "shared": true,

+        "sort": 0,

+        "value_type": "individual"

+      },

+      "type": "graph",

+      "xaxis": {

+        "buckets": null,

+        "mode": "time",

+        "name": null,

+        "show": true,

+        "values": []

+      },

+      "yaxes": [

+        {

+          "format": "short",

+          "label": null,

+          "logBase": 1,

+          "max": null,

+          "min": null,

+          "show": true

+        },

+        {

+          "format": "short",

+          "label": null,

+          "logBase": 1,

+          "max": null,

+          "min": null,

+          "show": false

+        }

+      ],

+      "yaxis": {

+        "align": false,

+        "alignLevel": null

+      }

+    },

+    {

+      "aliasColors": {},

+      "bars": false,

+      "dashLength": 10,

+      "dashes": false,

+      "datasource": null,

+      "fill": 1,

+      "fillGradient": 0,

+      "gridPos": {

+        "h": 7,

+        "w": 24,

+        "x": 0,

+        "y": 12

+      },

+      "id": 23,

+      "interval": "",

+      "legend": {

+        "alignAsTable": true,

+        "avg": true,

+        "current": false,

+        "max": true,

+        "min": true,

+        "rightSide": true,

+        "show": true,

+        "total": false,

+        "values": true

+      },

+      "lines": true,

+      "linewidth": 1,

+      "nullPointMode": "null",

+      "options": {

+        "dataLinks": []

+      },

+      "percentage": false,

+      "pointradius": 2,

+      "points": false,

+      "renderer": "flot",

+      "seriesOverrides": [

+        {

+          "alias": "Engine Load",

+          "transform": "negative-Y"

+        }

+      ],

+      "spaceLength": 10,

+      "stack": false,

+      "steppedLine": false,

+      "targets": [

+        {

+          "alias": "$col",

+          "groupBy": [

+            {

+              "params": [

+                "$__interval"

+              ],

+              "type": "time"

+            },

+            {

+              "params": [

+                "previous"

+              ],

+              "type": "fill"

+            }

+          ],

+          "measurement": "/^$Car$/",

+          "orderByTime": "ASC",

+          "policy": "default",

+          "refId": "A",

+          "resultFormat": "time_series",

+          "select": [

+            [

+              {

+                "params": [

+                  "engineLoad"

+                ],

+                "type": "field"

+              },

+              {

+                "params": [],

+                "type": "mean"

+              },

+              {

+                "params": [

+                  "Engine Load"

+                ],

+                "type": "alias"

+              }

+            ]

+          ],

+          "tags": []

+        },

+        {

+          "alias": "$col",

+          "groupBy": [

+            {

+              "params": [

+                "$__interval"

+              ],

+              "type": "time"

+            },

+            {

+              "params": [

+                "previous"

+              ],

+              "type": "fill"

+            }

+          ],

+          "measurement": "/^$Car$/",

+          "orderByTime": "ASC",

+          "policy": "default",

+          "refId": "B",

+          "resultFormat": "time_series",

+          "select": [

+            [

+              {

+                "params": [

+                  "MPGInstant"

+                ],

+                "type": "field"

+              },

+              {

+                "params": [],

+                "type": "mean"

+              },

+              {

+                "params": [

+                  "MPG"

+                ],

+                "type": "alias"

+              }

+            ]

+          ],

+          "tags": []

+        }

+      ],

+      "thresholds": [],

+      "timeFrom": null,

+      "timeRegions": [],

+      "timeShift": null,

+      "title": "Load vs MPG",

+      "tooltip": {

+        "shared": true,

+        "sort": 0,

+        "value_type": "individual"

+      },

+      "type": "graph",

+      "xaxis": {

+        "buckets": null,

+        "mode": "time",

+        "name": null,

+        "show": true,

+        "values": []

+      },

+      "yaxes": [

+        {

+          "format": "short",

+          "label": null,

+          "logBase": 1,

+          "max": null,

+          "min": null,

+          "show": true

+        },

+        {

+          "format": "short",

+          "label": null,

+          "logBase": 1,

+          "max": null,

+          "min": null,

+          "show": false

+        }

+      ],

+      "yaxis": {

+        "align": false,

+        "alignLevel": null

+      }

+    },

+    {

+      "aliasColors": {},

+      "breakPoint": "50%",

+      "cacheTimeout": null,

+      "combine": {

+        "label": "Others",

+        "threshold": 0

+      },

+      "datasource": "telegraf",

+      "decimals": 2,

+      "fontSize": "120%",

+      "format": "short",

+      "gridPos": {

+        "h": 9,

+        "w": 12,

+        "x": 0,

+        "y": 19

+      },

+      "id": 2,

+      "interval": null,

+      "legend": {

+        "header": "",

+        "percentage": true,

+        "show": true,

+        "values": true

+      },

+      "legendType": "On graph",

+      "links": [],

+      "maxDataPoints": 3,

+      "nullPointMode": "connected",

+      "options": {},

+      "pieType": "pie",

+      "pluginVersion": "6.4.3",

+      "strokeWidth": "3",

+      "targets": [

+        {

+          "alias": "$col",

+          "groupBy": [

+            {

+              "params": [

+                "$__interval"

+              ],

+              "type": "time"

+            },

+            {

+              "params": [

+                "previous"

+              ],

+              "type": "fill"

+            }

+          ],

+          "measurement": "/^$Car$/",

+          "orderByTime": "ASC",

+          "policy": "default",

+          "refId": "A",

+          "resultFormat": "time_series",

+          "select": [

+            [

+              {

+                "params": [

+                  "timerStationary"

+                ],

+                "type": "field"

+              },

+              {

+                "params": [],

+                "type": "mean"

+              },

+              {

+                "params": [

+                  "/60"

+                ],

+                "type": "math"

+              },

+              {

+                "params": [

+                  "Stopped"

+                ],

+                "type": "alias"

+              }

+            ]

+          ],

+          "tags": []

+        },

+        {

+          "alias": "$col",

+          "groupBy": [

+            {

+              "params": [

+                "$__interval"

+              ],

+              "type": "time"

+            },

+            {

+              "params": [

+                "previous"

+              ],

+              "type": "fill"

+            }

+          ],

+          "measurement": "/^$Car$/",

+          "orderByTime": "ASC",

+          "policy": "default",

+          "refId": "B",

+          "resultFormat": "time_series",

+          "select": [

+            [

+              {

+                "params": [

+                  "timerMoving"

+                ],

+                "type": "field"

+              },

+              {

+                "params": [],

+                "type": "mean"

+              },

+              {

+                "params": [

+                  "/60"

+                ],

+                "type": "math"

+              },

+              {

+                "params": [

+                  "Moving"

+                ],

+                "type": "alias"

+              }

+            ]

+          ],

+          "tags": []

+        }

+      ],

+      "timeFrom": null,

+      "timeShift": null,

+      "title": "Cummulative Minutes",

+      "type": "grafana-piechart-panel",

+      "valueName": "avg"

+    },

+    {

+      "circleMaxSize": "2",

+      "circleMinSize": "1",

+      "colors": [

+        "rgba(245, 54, 54, 0.9)",

+        "#FA6400",

+        "#FFF899",

+        "#F2CC0C",

+        "rgba(50, 172, 45, 0.97)"

+      ],

+      "datasource": null,

+      "decimals": 0,

+      "esMetric": "Count",

+      "gridPos": {

+        "h": 18,

+        "w": 12,

+        "x": 12,

+        "y": 19

+      },

+      "hideEmpty": false,

+      "hideZero": false,

+      "id": 8,

+      "initialZoom": "10",

+      "locationData": "table",

+      "mapCenter": "custom",

+      "mapCenterLatitude": "39.13",

+      "mapCenterLongitude": "-84.63",

+      "maxDataPoints": 1,

+      "mouseWheelZoom": false,

+      "options": {},

+      "showLegend": true,

+      "stickyLabels": false,

+      "tableQueryOptions": {

+        "geohashField": "geohash",

+        "labelField": "",

+        "latitudeField": "Lat",

+        "longitudeField": "Long",

+        "metricField": "Altitude",

+        "queryType": "coordinates"

+      },

+      "targets": [

+        {

+          "groupBy": [],

+          "measurement": "/^$Car$/",

+          "orderByTime": "ASC",

+          "policy": "default",

+          "refId": "A",

+          "resultFormat": "table",

+          "select": [

+            [

+              {

+                "params": [

+                  "GPSLatitude"

+                ],

+                "type": "field"

+              },

+              {

+                "params": [

+                  "Lat"

+                ],

+                "type": "alias"

+              }

+            ],

+            [

+              {

+                "params": [

+                  "GPSLongitude"

+                ],

+                "type": "field"

+              },

+              {

+                "params": [

+                  "Long"

+                ],

+                "type": "alias"

+              }

+            ],

+            [

+              {

+                "params": [

+                  "speedOBD"

+                ],

+                "type": "field"

+              },

+              {

+                "params": [

+                  "MPH"

+                ],

+                "type": "alias"

+              }

+            ]

+          ],

+          "tags": []

+        }

+      ],

+      "thresholds": "0,35,55,60",

+      "timeFrom": null,

+      "timeShift": null,

+      "title": "Average Speed",

+      "type": "grafana-worldmap-panel",

+      "unitPlural": "MPH",

+      "unitSingle": "",

+      "unitSingular": "MPH",

+      "valueName": "avg"

+    },

+    {

+      "aliasColors": {},

+      "bars": false,

+      "dashLength": 10,

+      "dashes": false,

+      "datasource": null,

+      "fill": 1,

+      "fillGradient": 0,

+      "gridPos": {

+        "h": 9,

+        "w": 12,

+        "x": 0,

+        "y": 28

+      },

+      "id": 21,

+      "interval": "",

+      "legend": {

+        "avg": false,

+        "current": false,

+        "max": false,

+        "min": false,

+        "show": true,

+        "total": false,

+        "values": false

+      },

+      "lines": true,

+      "linewidth": 1,

+      "nullPointMode": "null",

+      "options": {

+        "dataLinks": []

+      },

+      "percentage": false,

+      "pointradius": 2,

+      "points": false,

+      "renderer": "flot",

+      "seriesOverrides": [],

+      "spaceLength": 10,

+      "stack": false,

+      "steppedLine": false,

+      "targets": [

+        {

+          "alias": "$col",

+          "groupBy": [

+            {

+              "params": [

+                "$__interval"

+              ],

+              "type": "time"

+            },

+            {

+              "params": [

+                "0"

+              ],

+              "type": "fill"

+            }

+          ],

+          "measurement": "/^$Car$/",

+          "orderByTime": "ASC",

+          "policy": "default",

+          "refId": "A",

+          "resultFormat": "time_series",

+          "select": [

+            [

+              {

+                "params": [

+                  "CO2Instant"

+                ],

+                "type": "field"

+              },

+              {

+                "params": [],

+                "type": "mean"

+              },

+              {

+                "params": [

+                  "CO2"

+                ],

+                "type": "alias"

+              }

+            ]

+          ],

+          "tags": []

+        }

+      ],

+      "thresholds": [],

+      "timeFrom": null,

+      "timeRegions": [],

+      "timeShift": null,

+      "title": "CO2",

+      "tooltip": {

+        "shared": true,

+        "sort": 0,

+        "value_type": "individual"

+      },

+      "type": "graph",

+      "xaxis": {

+        "buckets": null,

+        "mode": "time",

+        "name": null,

+        "show": true,

+        "values": []

+      },

+      "yaxes": [

+        {

+          "format": "short",

+          "label": null,

+          "logBase": 1,

+          "max": null,

+          "min": null,

+          "show": true

+        },

+        {

+          "format": "short",

+          "label": null,

+          "logBase": 1,

+          "max": null,

+          "min": null,

+          "show": false

+        }

+      ],

+      "yaxis": {

+        "align": false,

+        "alignLevel": null

+      }

+    },

+    {

+      "aliasColors": {},

+      "bars": false,

+      "dashLength": 10,

+      "dashes": false,

+      "datasource": null,

+      "fill": 1,

+      "fillGradient": 4,

+      "gridPos": {

+        "h": 9,

+        "w": 12,

+        "x": 0,

+        "y": 37

+      },

+      "id": 18,

+      "interval": "",

+      "legend": {

+        "alignAsTable": true,

+        "avg": false,

+        "current": false,

+        "max": false,

+        "min": false,

+        "show": true,

+        "total": false,

+        "values": false

+      },

+      "lines": true,

+      "linewidth": 1,

+      "nullPointMode": "null",

+      "options": {

+        "dataLinks": []

+      },

+      "percentage": false,

+      "pointradius": 2,

+      "points": false,

+      "renderer": "flot",

+      "seriesOverrides": [

+        {

+          "alias": "% Charged",

+          "color": "#C4162A"

+        }

+      ],

+      "spaceLength": 10,

+      "stack": false,

+      "steppedLine": false,

+      "targets": [

+        {

+          "alias": "$col",

+          "groupBy": [

+            {

+              "params": [

+                "$__interval"

+              ],

+              "type": "time"

+            },

+            {

+              "params": [

+                "previous"

+              ],

+              "type": "fill"

+            }

+          ],

+          "measurement": "/^$Car$/",

+          "orderByTime": "ASC",

+          "policy": "default",

+          "refId": "A",

+          "resultFormat": "time_series",

+          "select": [

+            [

+              {

+                "params": [

+                  "batteryLevelAndroid"

+                ],

+                "type": "field"

+              },

+              {

+                "params": [],

+                "type": "mean"

+              },

+              {

+                "params": [

+                  "% Charged"

+                ],

+                "type": "alias"

+              }

+            ]

+          ],

+          "tags": []

+        }

+      ],

+      "thresholds": [],

+      "timeFrom": null,

+      "timeRegions": [],

+      "timeShift": null,

+      "title": "Phone Battery Level",

+      "tooltip": {

+        "shared": true,

+        "sort": 0,

+        "value_type": "individual"

+      },

+      "type": "graph",

+      "xaxis": {

+        "buckets": null,

+        "mode": "time",

+        "name": null,

+        "show": true,

+        "values": []

+      },

+      "yaxes": [

+        {

+          "decimals": 0,

+          "format": "percent",

+          "label": "",

+          "logBase": 1,

+          "max": null,

+          "min": null,

+          "show": true

+        },

+        {

+          "format": "short",

+          "label": null,

+          "logBase": 1,

+          "max": null,

+          "min": null,

+          "show": true

+        }

+      ],

+      "yaxis": {

+        "align": false,

+        "alignLevel": null

+      }

+    },

+    {

+      "circleMaxSize": "3",

+      "circleMinSize": 2,

+      "colors": [

+        "rgba(245, 54, 54, 0.9)",

+        "#FA6400",

+        "#FFF899",

+        "#F2CC0C",

+        "rgba(50, 172, 45, 0.97)"

+      ],

+      "datasource": null,

+      "decimals": 0,

+      "esMetric": "Count",

+      "gridPos": {

+        "h": 18,

+        "w": 12,

+        "x": 12,

+        "y": 37

+      },

+      "hideEmpty": false,

+      "hideZero": false,

+      "id": 4,

+      "initialZoom": "10",

+      "locationData": "table",

+      "mapCenter": "custom",

+      "mapCenterLatitude": "39.13",

+      "mapCenterLongitude": "-84.63",

+      "maxDataPoints": 1,

+      "mouseWheelZoom": false,

+      "options": {},

+      "showLegend": true,

+      "stickyLabels": false,

+      "tableQueryOptions": {

+        "geohashField": "geohash",

+        "labelField": "",

+        "latitudeField": "Lat",

+        "longitudeField": "Long",

+        "metricField": "Altitude",

+        "queryType": "coordinates"

+      },

+      "targets": [

+        {

+          "groupBy": [],

+          "measurement": "Buick",

+          "orderByTime": "ASC",

+          "policy": "default",

+          "refId": "A",

+          "resultFormat": "table",

+          "select": [

+            [

+              {

+                "params": [

+                  "GPSLatitude"

+                ],

+                "type": "field"

+              },

+              {

+                "params": [

+                  "Lat"

+                ],

+                "type": "alias"

+              }

+            ],

+            [

+              {

+                "params": [

+                  "GPSLongitude"

+                ],

+                "type": "field"

+              },

+              {

+                "params": [

+                  "Long"

+                ],

+                "type": "alias"

+              }

+            ],

+            [

+              {

+                "params": [

+                  "GPSAltitude"

+                ],

+                "type": "field"

+              },

+              {

+                "params": [

+                  "Altitude"

+                ],

+                "type": "alias"

+              }

+            ]

+          ],

+          "tags": []

+        }

+      ],

+      "thresholds": "0,500,100,1000",

+      "timeFrom": null,

+      "timeShift": null,

+      "title": "Altitude",

+      "type": "grafana-worldmap-panel",

+      "unitPlural": "feet",

+      "unitSingle": "",

+      "unitSingular": "feet",

+      "valueName": "avg"

+    },

+    {

+      "aliasColors": {},

+      "bars": false,

+      "dashLength": 10,

+      "dashes": false,

+      "datasource": null,

+      "fill": 1,

+      "fillGradient": 4,

+      "gridPos": {

+        "h": 9,

+        "w": 12,

+        "x": 0,

+        "y": 46

+      },

+      "id": 19,

+      "interval": "",

+      "legend": {

+        "alignAsTable": true,

+        "avg": false,

+        "current": false,

+        "max": false,

+        "min": false,

+        "show": true,

+        "total": false,

+        "values": false

+      },

+      "lines": true,

+      "linewidth": 1,

+      "nullPointMode": "null",

+      "options": {

+        "dataLinks": []

+      },

+      "percentage": false,

+      "pointradius": 2,

+      "points": false,

+      "renderer": "flot",

+      "seriesOverrides": [

+        {

+          "alias": "% Charged",

+          "color": "#C4162A"

+        }

+      ],

+      "spaceLength": 10,

+      "stack": false,

+      "steppedLine": false,

+      "targets": [

+        {

+          "alias": "$col",

+          "groupBy": [

+            {

+              "params": [

+                "$__interval"

+              ],

+              "type": "time"

+            },

+            {

+              "params": [

+                "previous"

+              ],

+              "type": "fill"

+            }

+          ],

+          "measurement": "/^$Car$/",

+          "orderByTime": "ASC",

+          "policy": "default",

+          "refId": "A",

+          "resultFormat": "time_series",

+          "select": [

+            [

+              {

+                "params": [

+                  "GPSSatellites"

+                ],

+                "type": "field"

+              },

+              {

+                "params": [],

+                "type": "mean"

+              },

+              {

+                "params": [

+                  "Sat Locks"

+                ],

+                "type": "alias"

+              }

+            ]

+          ],

+          "tags": []

+        }

+      ],

+      "thresholds": [],

+      "timeFrom": null,

+      "timeRegions": [],

+      "timeShift": null,

+      "title": "GPS Satellites",

+      "tooltip": {

+        "shared": true,

+        "sort": 0,

+        "value_type": "individual"

+      },

+      "type": "graph",

+      "xaxis": {

+        "buckets": null,

+        "mode": "time",

+        "name": null,

+        "show": true,

+        "values": []

+      },

+      "yaxes": [

+        {

+          "decimals": 0,

+          "format": "short",

+          "label": "",

+          "logBase": 1,

+          "max": null,

+          "min": null,

+          "show": true

+        },

+        {

+          "format": "short",

+          "label": null,

+          "logBase": 1,

+          "max": null,

+          "min": null,

+          "show": true

+        }

+      ],

+      "yaxis": {

+        "align": false,

+        "alignLevel": null

+      }

+    },

+    {

+      "circleMaxSize": "3",

+      "circleMinSize": 2,

+      "colors": [

+        "rgba(245, 54, 54, 0.9)",

+        "#FA6400",

+        "#FADE2A",

+        "#37872D"

+      ],

+      "datasource": null,

+      "decimals": 0,

+      "esMetric": "Count",

+      "gridPos": {

+        "h": 25,

+        "w": 24,

+        "x": 0,

+        "y": 55

+      },

+      "hideEmpty": false,

+      "hideZero": false,

+      "id": 26,

+      "initialZoom": "10",

+      "locationData": "table",

+      "mapCenter": "custom",

+      "mapCenterLatitude": "39.13",

+      "mapCenterLongitude": "-84.63",

+      "maxDataPoints": 1,

+      "mouseWheelZoom": false,

+      "options": {},

+      "showLegend": true,

+      "stickyLabels": false,

+      "tableQueryOptions": {

+        "geohashField": "geohash",

+        "labelField": "",

+        "latitudeField": "Lat",

+        "longitudeField": "Long",

+        "metricField": "Altitude",

+        "queryType": "coordinates"

+      },

+      "targets": [

+        {

+          "groupBy": [],

+          "measurement": "/^$Car$/",

+          "orderByTime": "ASC",

+          "policy": "default",

+          "refId": "A",

+          "resultFormat": "table",

+          "select": [

+            [

+              {

+                "params": [

+                  "GPSLatitude"

+                ],

+                "type": "field"

+              },

+              {

+                "params": [

+                  "Lat"

+                ],

+                "type": "alias"

+              }

+            ],

+            [

+              {

+                "params": [

+                  "GPSLongitude"

+                ],

+                "type": "field"

+              },

+              {

+                "params": [

+                  "Long"

+                ],

+                "type": "alias"

+              }

+            ],

+            [

+              {

+                "params": [

+                  "MPGInstant"

+                ],

+                "type": "field"

+              },

+              {

+                "params": [

+                  "Altitude"

+                ],

+                "type": "alias"

+              }

+            ]

+          ],

+          "tags": []

+        }

+      ],

+      "thresholds": "10,20,30",

+      "timeFrom": null,

+      "timeShift": null,

+      "title": "MPG",

+      "type": "grafana-worldmap-panel",

+      "unitPlural": "M/PG",

+      "unitSingle": "",

+      "unitSingular": "M/PG",

+      "valueName": "avg"

+    }

+  ],

+  "refresh": false,

+  "schemaVersion": 20,

+  "style": "dark",

+  "tags": [

+    "torque",

+    "car"

+  ],

+  "templating": {

+    "list": [

+      {

+        "current": {

+          "text": "Buick",

+          "value": "Buick"

+        },

+        "hide": 0,

+        "label": "Car",

+        "name": "Car",

+        "options": [

+          {

+            "text": "Buick",

+            "value": "Buick"

+          }

+        ],

+        "query": "Buick",

+        "skipUrlSync": false,

+        "type": "textbox"

+      }

+    ]

+  },

+  "time": {

+    "from": "now-24h",

+    "to": "now"

+  },

+  "timepicker": {

+    "refresh_intervals": [

+      "5s",

+      "10s",

+      "30s",

+      "1m",

+      "5m",

+      "15m",

+      "30m",

+      "1h",

+      "2h",

+      "1d"

+    ]

+  },

+  "timezone": "",

+  "title": "Torque",

+  "uid": "2UyC4kRRz",

+  "version": 31

+}





diff --git a/grafana/torque/telegraf-torque.conf b/grafana/torque/telegraf-torque.conf
new file mode 100644
index 0000000000000000000000000000000000000000..4788151e65508578d273aa4380df85f4bcbb1bfc
--- /dev/null
+++ b/grafana/torque/telegraf-torque.conf
@@ -0,0 +1,42 @@
+# # Read metrics from MQTT topic(s) with json formatting
+ [[inputs.mqtt_consumer]]
+#   ## MQTT broker URLs to be used. The format should be scheme://host:port,
+#   ## schema can be tcp, ssl, or ws.
+   servers = ["tcp://<host>:<port>"]
+#
+#   ## MQTT QoS, must be 0, 1, or 2
+   qos = 0
+#   ## Connection timeout for initial connection in seconds
+   connection_timeout = "30s"
+#
+#   ## Topics to subscribe to
+   topics = ["torque/formatted"]
+#
+#   # if true, messages that can't be delivered while the subscriber is offline
+#   # will be delivered when it comes back (such as on service restart).
+#   # NOTE: if true, client_id MUST be set
+#   persistent_session = false
+#   # If empty, a random client ID will be generated.
+#   client_id = "telegraf"
+#
+#   ## username and password to connect MQTT server.
+#   # username = "telegraf"
+#   # password = "metricsmetricsmetricsmetrics"
+#
+#   ## Optional TLS Config
+#   # tls_ca = "/etc/telegraf/ca.pem"
+#   # tls_cert = "/etc/telegraf/cert.pem"
+#   # tls_key = "/etc/telegraf/key.pem"
+#   ## Use TLS but skip chain & host verification
+#   # insecure_skip_verify = false
+#
+#   ## Data format to consume.
+#   ## Each data format has its own unique set of configuration options, read
+#   ## more about them here:
+#   ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md
+   data_format = "json"
+   json_time_key = "time"
+   json_time_format = "unix_ms"
+   json_name_key = "appID_userEntered"
+   json_string_fields = ["session","appVersion","appID_MD5"]
+   tag_keys = ["session","appVersion","appID_MD5"]