RTRT.me - Real Time Race Tracking

Real-Time Race Tracking for World-Class Events

RTRT.me for TV ( Updated 2013-11-25 ) CHANGELOG
  • 2012-11-07
    - Options to get places and placeChanges updated. 'ranking' and rank options eliminated.

RTRT.me is an excellent solution for Broadcasters needing fast, reliable timing data for the purpose of generating Live TV graphics for an event.

Features

  • Live Publishing of detailed split info within seconds of tag read including:
    • Current Place (for category at split)
    • Change in Place (+ or - since last split)
    • Leader Diff (+ mm:ss.hh)
    • Current Pace (in miles and kilometers)
    • Current Speed (in mph and kmh).
    • Estimated Next Point (estimated time & time of day for runner at next point in race)
    • Estimated Finish (estimated time, time of day, & time remaining for runner finish)
    • Estimated Percentage of Completion (current progress)
    • Time & Time of Day at split
    • ...additionally
    • Custom Timing Stats can be Added and extraneous info can be Removed as requested
    • Time formats can be customized (unix, rounded, etc)
  • Participant profile lookups, or complete roster download.
  • Auto invalidation of unnatural tag reads (keeps leaderboards clean)
  • Support for complex setups including lapping, multiple simultaneous races with shared course points, etc.


Strategies

Live Place calculations are available on a per-category basis. Therefore, to get place information in your results, do queries on 'categories'.

Data can be retrieved by using either of the RTRT API's as explained below.

HTTP REST API

Use the RTRT.me REST API to make queries specific to the view you are needing to build.

See REST API documentation for more details.

Depending on your how your graphics software functions, the REST API may be a simpler alternative to the TCP method below. Here are a few options to consider when using the REST API for TV:

  1. To get a leaderboard, one simple strategy is to directly query a specific point & category.
  2. Example Query with:

    /events/EVENTDEMO/categories/top-women/splits/10M?timesort=1
    

    Use querystring 'timesort=1' to get splits in order of place on this query.

    Yields a result set such as:

    {
    	"list":[{
    		"time":"00:55:32.08",
    		"point":"10M",
    		"label":"10M",
    		"leaderDiff":"+00:00.00",
    		"placeChange":"1",
    		"place":"1",
    		"pid":"RYKLUSR6",
    		"timestamp":"1304150133.15",
    		"tag":"1106",
    		"name":"Karina Rosales",
    		"timeOfDay":"7:55:34 am",
    		"milePace":"05:33",
    		"milePaceAvg":"05:34",
    		"mph":"10.81",
    		"kmPace":"03:27",
    		"kmPaceAvg":"03:28",
    		"kmh":"17.40",
    		"etnp":"13.1M~01:12:45~8:12am",
    		"etfp":"FINISH~02:25:33~9:25am",
    		"startTime":"7:00:02 am",
    		"sex":"F",
    		"epochTime":"1304171733.15",
    		"pace":"05:33 min/mile",
    		"paceAvg":"05:34 min/mile",
    		"i":"1373325965_000123",
    		"u":"1385399843_000078"
    	},
    	{
    		"time":"00:55:37.87",
    		"point":"10M",
    		"label":"10M",
    		"leaderDiff":"+00:05.79",
    		"placeChange":"1",
    		"place":"2",
    		"pid":"RNL5C347",
    		"timestamp":"1304150138.94",
    		"tag":"1028",
    		"name":"Brenda McLeod",
    		"timeOfDay":"7:55:39 am",
    		"milePace":"05:34",
    		"milePaceAvg":"05:34",
    		"mph":"10.81",
    		"kmPace":"03:27",
    		"kmPaceAvg":"03:28",
    		"kmh":"17.39",
    		"etnp":"13.1M~01:12:51~8:12am",
    		"etfp":"FINISH~02:25:41~9:25am",
    		"startTime":"7:00:02 am",
    		"sex":"F",
    		"epochTime":"1304171738.94",
    		"pace":"05:34 min/mile",
    		"paceAvg":"05:34 min/mile",
    		"i":"1373325965_000145",
    		"u":"1385399843_000080"
    	},
    	{
    		"time":"00:55:42.16",
    		"point":"10M",
    		"label":"10M",
    		"leaderDiff":"+00:10.08",
    		"placeChange":"2",
    		"place":"3",
    		"pid":"R9BWRC35",
    		"timestamp":"1304150143.23",
    		"tag":"1007",
    		"name":"Jana Gross",
    		"timeOfDay":"7:55:44 am",
    		"milePace":"05:34",
    		"milePaceAvg":"05:35",
    		"mph":"10.81",
    		"kmPace":"03:27",
    		"kmPaceAvg":"03:28",
    		"kmh":"17.40",
    		"etnp":"13.1M~01:12:55~8:12am",
    		"etfp":"FINISH~02:25:44~9:25am",
    		"startTime":"7:00:02 am",
    		"sex":"F",
    		"epochTime":"1304171743.23",
    		"pace":"05:34 min/mile",
    		"paceAvg":"05:35 min/mile",
    		"i":"1373325965_000143",
    		"u":"1385399843_000082"
    	}],
    	"info":{
    		"first":"1",
    		"last":"3",
    		"lasti":"1373325965_000143",
    		"cacheVer":"30~7828",
    		"leaderTag":"1007",
    		"leaderPid":"RTRYHG84",
    		"latestPoint":"FINISH",
    		"epc":"100",
    		"emiles":"26.2187575",
    		"startTime":"07:00:01.07 US/Central"
    	}
    }
    

    Example: http://api.rtrt.me/events/EVENTDEMO/categories/top-women/splits/10M?timesort=1

    There is also a special keyword of LASTEST_POINT, which auto-selects the point which the leader of the category most recently crossed.

    /events/EVENTDEMO/categories/top-women/splits/LASTEST_POINT?timesort=1
    

    PLEASE NOTE: Since START splits have no place information, start splits are excluded when doing queries on categories.

    For more info on using live place calculations, please contact us.

    Do this on an interval, or as often as desired manually when building a view in the graphics software.

  3. It is possible to use the REST API to accomplish an "announcer" style scroller. For example, to get an unranked list of finishers that just came in, you can use the following polling strategy.

    Query with:

    /events/EVENTDEMO/points/FINISH/splits?reverse=1&igt=[LASTI]&max=10
    

    This would give you a list of runners that crossed since you last checked (based on lasti) and will cap it at max 10 (which is probably more than can be put on a TV screen in a given second). The first runner in the list will be the runner that most recently crossed, and the 'lasti' returned in the info area will be for that most recent runner. On your next query, use this "lasti" and you will once again get the most recently crossed runners.

    In summary, by doing max combined with igt of "lasti" and the reverse option, you are ensured to get at most [max] runners per query. Any splits beyond your max setting simply get skipped, which is usually the desired behavior if you have no way of using the extras.

    NOTE: It is only possible to test such an implementation by doing a real-time replay or simultaion of an event.

TCP API

Use the RTRT.me TCP API and your own socket client implementation to stream categories and points of interest in real time.

See TCP API documentation for more details on how to fully implement the protocol.

Example stream command:

stream~/events/EVENTDEMO/categories/top-women/splits/ALL_POINTS~0~agt

The above command would stream all elite-women splits soon as they arrive. Since 'agt' polling mode is specified, if ranks or times change for splits, they would be resent in the same stream with new "u" value.