CINXE.COM
Live Tracking
<!doctype html><html lang=en class=no-js> <head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=img/favicon.ico><meta name=generator content="mkdocs-1.4.1, mkdocs-material-8.5.7"><title>Live Tracking</title><link rel=stylesheet href=assets/stylesheets/main.20d9efc8.min.css><link rel=stylesheet href=assets/stylesheets/palette.cbb835fc.min.css><meta name=theme-color content=#ffffff><script>__md_scope=new URL(".",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script></head> <body dir=ltr data-md-color-scheme data-md-color-primary=white data-md-color-accent=black> <input class=md-toggle data-md-toggle=drawer type=checkbox id=__drawer autocomplete=off> <input class=md-toggle data-md-toggle=search type=checkbox id=__search autocomplete=off> <label class=md-overlay for=__drawer></label> <div data-md-component=skip> <a href=#live-tracking class=md-skip> Skip to content </a> </div> <div data-md-component=announce> </div> <header class=md-header data-md-component=header> <nav class="md-header__inner md-grid" aria-label=Header> <a href=index.html title="Live Tracking" class="md-header__button md-logo" aria-label="Live Tracking" data-md-component=logo> <img src=img/logo.png alt=logo> </a> <label class="md-header__button md-icon" for=__drawer> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg> </label> <div class=md-header__title data-md-component=header-title> <div class=md-header__ellipsis> <div class=md-header__topic> <span class=md-ellipsis> Live Tracking </span> </div> <div class=md-header__topic data-md-component=header-topic> <span class=md-ellipsis> About </span> </div> </div> </div> <label class="md-header__button md-icon" for=__search> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg> </label> <div class=md-search data-md-component=search role=dialog> <label class=md-search__overlay for=__search></label> <div class=md-search__inner role=search> <form class=md-search__form name=search> <input type=text class=md-search__input name=query aria-label=Search placeholder=Search autocapitalize=off autocorrect=off autocomplete=off spellcheck=false data-md-component=search-query required> <label class="md-search__icon md-icon" for=__search> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg> </label> <nav class=md-search__options aria-label=Search> <button type=reset class="md-search__icon md-icon" title=Clear aria-label=Clear tabindex=-1> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg> </button> </nav> </form> <div class=md-search__output> <div class=md-search__scrollwrap data-md-scrollfix> <div class=md-search-result data-md-component=search-result> <div class=md-search-result__meta> Initializing search </div> <ol class=md-search-result__list></ol> </div> </div> </div> </div> </div> </nav> </header> <div class=md-container data-md-component=container> <main class=md-main data-md-component=main> <div class="md-main__inner md-grid"> <div class="md-sidebar md-sidebar--primary" data-md-component=sidebar data-md-type=navigation> <div class=md-sidebar__scrollwrap> <div class=md-sidebar__inner> <nav class="md-nav md-nav--primary" aria-label=Navigation data-md-level=0> <label class=md-nav__title for=__drawer> <a href=index.html title="Live Tracking" class="md-nav__button md-logo" aria-label="Live Tracking" data-md-component=logo> <img src=img/logo.png alt=logo> </a> Live Tracking </label> <ul class=md-nav__list data-md-scrollfix> <li class="md-nav__item md-nav__item--active"> <input class="md-nav__toggle md-toggle" data-md-toggle=toc type=checkbox id=__toc> <label class="md-nav__link md-nav__link--active" for=__toc> About <span class="md-nav__icon md-icon"></span> </label> <a href=index.html class="md-nav__link md-nav__link--active"> About </a> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> <label class=md-nav__title for=__toc> <span class="md-nav__icon md-icon"></span> Table of contents </label> <ul class=md-nav__list data-md-component=toc data-md-scrollfix> <li class=md-nav__item> <a href=#input class=md-nav__link> Input </a> </li> <li class=md-nav__item> <a href=#output class=md-nav__link> Output </a> </li> <li class=md-nav__item> <a href=#features class=md-nav__link> Features </a> </li> <li class=md-nav__item> <a href=#requirements class=md-nav__link> Requirements </a> </li> <li class=md-nav__item> <a href=#developers-welcome class=md-nav__link> Developers Welcome </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=Install.html class=md-nav__link> Installation </a> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle" data-md-toggle=__nav_3 type=checkbox id=__nav_3> <label class=md-nav__link for=__nav_3> API <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=API data-md-level=1> <label class=md-nav__title for=__nav_3> <span class="md-nav__icon md-icon"></span> API </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=Getting-started.html class=md-nav__link> Getting started </a> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle" data-md-toggle=__nav_3_2 type=checkbox id=__nav_3_2> <label class=md-nav__link for=__nav_3_2> New User <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label="New User" data-md-level=2> <label class=md-nav__title for=__nav_3_2> <span class="md-nav__icon md-icon"></span> New User </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=Create-User-Register.html class=md-nav__link> Create User (Register) </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle" data-md-toggle=__nav_3_3 type=checkbox id=__nav_3_3> <label class=md-nav__link for=__nav_3_3> User Data <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label="User Data" data-md-level=2> <label class=md-nav__title for=__nav_3_3> <span class="md-nav__icon md-icon"></span> User Data </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=Get-User-List.html class=md-nav__link> Get User List </a> </li> <li class=md-nav__item> <a href=Get-User-Data.html class=md-nav__link> Get User Data </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle" data-md-toggle=__nav_3_4 type=checkbox id=__nav_3_4> <label class=md-nav__link for=__nav_3_4> Edit User <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label="Edit User" data-md-level=2> <label class=md-nav__title for=__nav_3_4> <span class="md-nav__icon md-icon"></span> Edit User </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=Change-Password.html class=md-nav__link> Change Password </a> </li> <li class=md-nav__item> <a href=Delete-User.html class=md-nav__link> Delete User </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle" data-md-toggle=__nav_3_5 type=checkbox id=__nav_3_5> <label class=md-nav__link for=__nav_3_5> Live Tracking <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label="Live Tracking" data-md-level=2> <label class=md-nav__title for=__nav_3_5> <span class="md-nav__icon md-icon"></span> Live Tracking </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=Writing-Data.html class=md-nav__link> Writing Data </a> </li> <li class=md-nav__item> <a href=Querying-Data.html class=md-nav__link> Querying Data </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=Imprint.html class=md-nav__link> Imprint </a> </li> </ul> </nav> </div> </div> </div> <div class="md-sidebar md-sidebar--secondary" data-md-component=sidebar data-md-type=toc> <div class=md-sidebar__scrollwrap> <div class=md-sidebar__inner> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> <label class=md-nav__title for=__toc> <span class="md-nav__icon md-icon"></span> Table of contents </label> <ul class=md-nav__list data-md-component=toc data-md-scrollfix> <li class=md-nav__item> <a href=#input class=md-nav__link> Input </a> </li> <li class=md-nav__item> <a href=#output class=md-nav__link> Output </a> </li> <li class=md-nav__item> <a href=#features class=md-nav__link> Features </a> </li> <li class=md-nav__item> <a href=#requirements class=md-nav__link> Requirements </a> </li> <li class=md-nav__item> <a href=#developers-welcome class=md-nav__link> Developers Welcome </a> </li> </ul> </nav> </div> </div> </div> <div class=md-content data-md-component=content> <article class="md-content__inner md-typeset"> <h1 id=live-tracking>Live Tracking</h1> <p>With this open source <strong>live tracking</strong> software you can record and analyze data in <strong>real time</strong>. You have full control over the data, because the software runs on your own server. You are able to track your time elapsed, distance, speed and elevation in real time. And if you have any <strong>ANT+</strong> or <strong>Bluetooth</strong> sensors, this data can also be transmitted. Optimized for easy use.</p> <h2 id=input>Input</h2> <p>With the Android app <a href=http://www.iforpowell.com/ >IpBike</a> you can transfer your data in real time. Deposit your access data in <code>Settings</code> > <code>Upload settings</code> > <code>Custom livetracking settings</code>. The app supports ANT+ and Bluetooth sensors. You can transfer your speed, heart rate, cadence and power as well as the GPS coordinates.</p> <p><a href="https://play.google.com/store/apps/details?id=com.iforpowell.android.ipbike"><img alt="Google Play Store" src=img/google-play-badge.png></a></p> <h2 id=output>Output</h2> <p>This software is very much based on <a href=https://www.influxdata.com/ >InfluxDB</a>. So you have all the advantages of a <strong>very fast time series database</strong>. It aims to answer queries in real-time. Each user comes with his own InfluxDB database for live tracking. Only you as an owner can write to the database. Currently you can save 8 hours of data.</p> <p>Your profile is always public, your friends can view your data at the following URL: <code>https://your-domain.local/watch/YOUR-USERNAME</code></p> <p><a href=https://youtu.be/HeffZvu_Zh0/ ><img alt=Screenshot src=img/screenshot.png></a></p> <p><strong><em>(Click the image to watch a demo video)</em></strong></p> <p>Because you have your own InfluxDB database, you can also use other evaluation programs. A popular program is e.g. <a href=http://docs.grafana.org/features/datasources/influxdb/ >Grafana</a>. Use the URL <code>https://your-domain.local</code> and the database name <code>YOUR-USERNAME</code>.</p> <h2 id=features>Features</h2> <ul> <li>Built-in HTTP API so you don't have to write any server side code to get up and running.</li> <li>SQL-like query language.</li> <li>Get data fast in and out.</li> <li>It aims to answer queries in real-time. That means every data point is indexed as it comes in and is immediately available in queries that should return in < 100ms.</li> </ul> <h2 id=requirements>Requirements</h2> <ul> <li><a href=http://php.net/ >PHP 7</a> and <a href=https://getcomposer.org/ >Composer</a></li> <li><a href=https://www.lighttpd.net/ >Lighttpd</a> or another web server</li> <li><a href=https://www.influxdata.com/products/influxdb-overview/ >InfluxDB</a></li> <li><a href=https://www.sqlite.org/ >SQLite</a></li> </ul> <h2 id=developers-welcome>Developers Welcome</h2> <p>You can use this software as the back end for live tracking. It is very easy to integrate into existing apps. The back end is coded in PHP. Data is stored in a SQLite and InfuxDB database. The transfer is done via an HTTP API. You will find more details in the <a href=Getting-started.html>API documentation</a>.</p> <p><a href=https://github.com/livetracking><img alt=GitHub src=img/github.png></a></p> </article> </div> </div> </main> <footer class=md-footer> <nav class="md-footer__inner md-grid" aria-label=Footer> <a href=Install.html class="md-footer__link md-footer__link--next" aria-label="Next: Installation" rel=next> <div class=md-footer__title> <div class=md-ellipsis> <span class=md-footer__direction> Next </span> Installation </div> </div> <div class="md-footer__button md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4Z"/></svg> </div> </a> </nav> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class=md-copyright> Made with <a href=https://squidfunk.github.io/mkdocs-material/ target=_blank rel=noopener> Material for MkDocs </a> </div> </div> </div> </footer> </div> <div class=md-dialog data-md-component=dialog> <div class="md-dialog__inner md-typeset"></div> </div> <script id=__config type=application/json>{"base": ".", "features": [], "search": "assets/javascripts/workers/search.16e2a7d4.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version.title": "Select version"}}</script> <script src=assets/javascripts/bundle.8492ddcf.min.js></script> </body> </html>