WiThrottle Protocol Specification
Technical reference for the WiThrottle™ network protocol as used by mobile throttle apps (Engine Driver, WiThrottle for iOS, …) and JMRI-class servers.
Sources: - JMRI WiThrottle Protocol — Protocol.shtml. Normative description of commands, delimiters, and the MultiThrottle model implemented by JMRI's
jmri.jmrit.withrottlepackage. - flash62au/WiThrottleProtocol (Arduino/ESP32 client library) — github.com/flash62au/WiThrottleProtocol, library docs. De-facto reference for client behaviour: heartbeat handling, command pacing, MultiThrottle command builders, and parsing edge cases on real hardware (JMRI, Digitrax LNWI, RailBOX RB1110).Conventions: - Commands and responses are plain ASCII text, one logical message per line. - Examples show the payload only; each line is terminated by a newline (see §2.2). - Loco addresses are written
Snnn(short, 1–127) orLnnn(long, 128–10239). - WiThrottle™ is a trademark; message formats reproduced here are for interoperability.
Overview & design philosophy
Transport & discovery
Framing & delimiters
Connection lifecycle
Initial server messages
Client registration & heartbeat
MultiThrottle model
Locomotive acquisition & release
Throttle actions
Server property notifications
Track power
Turnouts / points
Routes
Consists (roster & advanced)
Fast clock
Alerts, server identity & misc
Deprecated & auxiliary commands
Client implementation notes
BigFred mapping
Appendix A – Command quick reference
Appendix B – Worked examples
1 Overview & design philosophy
WiThrottle is a client–server, line-oriented text protocol over TCP/IP. A server (JMRI, Digitrax LNWI, RailBOX RB1110, …) owns the connection to the DCC command station; clients (mobile throttles, hardware panels, automation scripts) send terse single-line commands and receive asynchronous updates.
Design properties:
| Property | Detail |
|---|---|
| Encoding | 7-bit-safe ASCII (no binary framing) |
| Direction | Full duplex; server may push state without a prior request |
| State model | MultiThrottle — up to several logical throttle instances per TCP session, each holding one or more loco addresses |
| Addressing | DCC short (S) / long (L) prefixes on numeric addresses |
| Speed | NMRA 128-step encoding: 0 = stop, 1 = emergency stop, 2…126 = speed |
| Functions | F0–F31 (protocol 2.0); momentary vs latching is server/roster dependent |
| Resilience | Optional heartbeat with server-side emergency stop on timeout |
Unlike LocoNet (§ peer bus) or Z21 LAN (§ binary UDP), WiThrottle is intentionally simple for mobile apps: no checksums, no slot numbers — the server maps loco addresses to command-station resources internally.
2 Transport & discovery
2.1 TCP connection
| Parameter | Typical value |
|---|---|
| Transport | TCP |
| Port | 12090 (de-facto standard; JMRI default, RailBOX RB1110 since FW ≥ 8.0) |
| Session | One TCP connection per client device |
JMRI and most servers accept a single long-lived connection per client. The client
should send Q before closing so the server can release throttles promptly.
2.2 Line termination
Each command or response is one line. A line ends with:
| Sequence | Hex |
|---|---|
| Line feed | 0x0A |
| Carriage return | 0x0D |
| CR + LF | 0x0D 0x0A |
Both peers must accept any of the above as end-of-line. JMRI commonly emits
two consecutive newlines after some responses; robust clients trigger on the
first terminator and discard the second empty line
(WiThrottleProtocol.cpp
check()).
There is no escape mechanism — command text must not contain raw newline characters.
2.3 Service discovery (mDNS / Bonjour)
Clients may locate servers with a multicast DNS browse for:
_withrottle._tcp.local
Discovery is best-effort (depends on OS, firewall, and VLAN isolation). Production clients should always allow manual host + port entry. Engine Driver and WiThrottle for iOS both support mDNS and static configuration.
2.4 Known server deployments
| Server | Port | Notes |
|---|---|---|
| JMRI | 12090 (configurable) | Reference implementation |
| Digitrax LNWI | 12090 | WiThrottle bridge to LocoNet; may emit AT+CIPSENDBUF= noise and PFC (§16.4) |
| RailBOX RB1110 | 12090 | Alongside Z21 UDP 21105, LocoNet-TCP 5560, LenzLAN 5550 — see RB1110 §6.3 |
3 Framing & delimiters
WiThrottle packs structured data into flat strings using fixed three-character delimiters (defined in WiThrottleProtocol.h):
| Delimiter | Constant | Role |
|---|---|---|
]\[ |
ENTRY_SEPARATOR |
Separates array elements (roster entries, function labels, consist members, …) |
}\{ |
SEGMENT_SEPARATOR |
Separates fields within one element |
<;> |
PROPERTY_SEPARATOR |
Separates major command parts (MultiThrottle sub-commands) |
<:> |
(consist commands) | Separates consist name vs address in RC+ / RC- |
3.1 Roster example
Two roster entries:
RL2]\[RGS 41}|{41}|{L]\[Test Loco}|{1234}|{L
Parsed as:
| Entry | Name | Address | Length flag |
|---|---|---|---|
| 1 | RGS 41 |
41 | L (long address) |
| 2 | Test Loco |
1234 | L |
The count after RL (2) must match the number of ]\[-delimited entries.
S vs L in the third field indicates short vs long DCC address format for
that roster entry.
3.2 MultiThrottle example
Add long-address loco 341 to throttle 0, referencing roster entry D&RGW 341:
M0+L341<;>ED&RGW 341
The part before <;> is the acquisition key (+L341); the part after is
the address selector passed to the server's throttle controller (ED&RGW 341).
4 Connection lifecycle
Typical client sequence:
Ordering notes:
- Some servers (including JMRI) defer the §5 initial burst until the client sends
HUand/orN. HUmust be unique per simultaneous connection — duplicate IDs may be rejected. Mobile apps typically use a random UUID string.Nsets the human-readable name shown in the server's WiThrottle window.- The server replies to
Nwith*«seconds»— the emergency-stop timeout if no further commands arrive (§6).
5 Initial server messages
After connect (and often after HU / N), the server may send one line per
topic. Lines can arrive in any order; clients should parse by two- or
three-letter prefix.
5.1 Protocol version — VN
VN2.0
| Field | Meaning |
|---|---|
VN |
Version announcement |
2.0 |
Protocol level |
Engine Driver requires ≥ 2.0. Syntax before 2.0 used deprecated single-throttle
T / S / MT prefixes (§17).
5.2 Roster list — RL
RL0
RL2]\[RGS 41}|{41}|{L]\[Test Loco}|{1234}|{L
| Field | Meaning |
|---|---|
RL |
Roster list |
0 / n |
Entry count |
]\[ … |
Per-entry: name}|{address}|{S\|L |
5.3 Track power — PPA
PPA1
| Value | Meaning |
|---|---|
0 |
Off |
1 |
On |
2 |
Unknown |
Also used as a client → server command (§11).
5.4 Turnout captions — PTT
PTT]\[Turnouts}|{Turnout]\[Closed}|{2]\[Thrown}|{4]\[Unknown}|{1]\[Inconsistent}|{8
Provides human-readable labels and numeric state codes for turnout feedback
(§12). The outer ]\[ pair wraps the global title and per-state entries.
5.5 Turnout list — PTL
PTL]\[LT12}|{Rico Station N}|{1]\[LT324}|{Rico Station S}|{2
| Field | Meaning |
|---|---|
| System name | JMRI system name (e.g. LT12) — used in PTA commands |
| User name | Display label |
| State | Current state code (see §12.3) |
PTL alone (no entries) means zero turnouts.
5.6 Route captions — PRT and list — PRL
Same pattern as turnouts:
PRT]\[Routes}|{Route]\[Active}|{2]\[Inactive}|{4]\[Unknown}|{0]\[Inconsistent}|{8
PRL]\[IR:AUTO:0001}|{Rico Main}|{2
Route state codes: 2 = Active, 4 = Inactive, 8 = Inconsistent, 0 /
1 = Unknown (server-dependent).
5.7 Consist list — RCC / RCL / RCD
Header (treat RCC and RCL identically):
RCC2
Per-consist lines (one line each — not the same ]\[ roster pattern):
RCD}|{74(S)}|{74(S)]\[3374(L)}|{true]\[346(L)}|{true
| Field | Meaning |
|---|---|
| Consist address | e.g. 74(S) |
| Consist ID | Usually same as address |
| Members | ]\[ array of address}|{facing where facing is true / false |
5.8 Web server port — PW
PW12080
JMRI embedded web UI port (informational for clients that deep-link into JMRI).
6 Client registration & heartbeat
6.1 Device ID — HU
HUa1b2c3d4-e5f6-7890-abcd-ef1234567890
| Segment | Description |
|---|---|
HU |
Hardware / unique client identifier |
| remainder | Opaque string; must differ across simultaneous connections |
6.2 Device name — N
NJohn's Throttle
Any text except newline. Server reply:
*10
| Reply | Meaning |
|---|---|
*«n» |
If no command or heartbeat within n seconds, server may E-stop controlled locos (0 = heartbeat not required) |
6.3 Heartbeat — *
| Command | Direction | Meaning |
|---|---|---|
* |
Client → server | "I am alive" |
*+ |
Client → server | Enable heartbeat monitoring |
*− |
Client → server | Disable heartbeat monitoring |
*«n» |
Server → client | Configured timeout (after N) |
Heartbeat monitoring is off until the client sends *+. While enabled, any
valid client command (including *) resets the watchdog. The
flash62au client alternates *
with re-sending N«name» to force a server response when half the period has
elapsed.
6.4 Quit — Q
Q
Client announces disconnect; server should release throttles tied to this session.
7 MultiThrottle model
Protocol 2.0 routes all throttle traffic through M (MultiThrottle) commands.
The character immediately after M selects the throttle instance:
| ID | Alias | Numeric index |
|---|---|---|
0 … 9 |
— | 0 … 9 |
T |
legacy default | 0 |
S |
second throttle (legacy) | 1 |
G |
third throttle (legacy) | 2 |
Each MultiThrottle instance holds zero or more loco addresses (an on-the-fly
"consist" from the protocol's point of view — distinct from NMRA advanced consists
in §14). Engine Driver uses 0–6; the flash62au library supports 6 instances
(0–5 plus T).
Important: do not mix legacy T-prefixed APIs with 0-prefixed MultiThrottle
APIs in one program — legacy code uses defunct throttle id T, modern code uses
0 (library README).
7.1 MultiThrottle command shape
M«throttleId»«operation»«locoKey»<;>«payload»
| Operation (3rd char) | Meaning |
|---|---|
+ |
Add loco (§8.1) |
− |
Remove loco (§8.2) |
S |
Steal prompt / steal request (§8.3) |
A |
Throttle action on locoKey (§9) |
L |
Function label list from roster (§10.2) |
locoKey is normally Snnn, Lnnn, or * (all locos on this MultiThrottle).
8 Locomotive acquisition & release
8.1 Add locomotive — M…+
M0+S3<;>S3
M0+L341<;>ED&RGW 341
| Part | Meaning |
|---|---|
+S3 / +L341 |
Acquisition key used in later A commands |
<;> |
Separator |
S3 / ED&RGW 341 |
Address selector: raw S/L address or roster entry E«id» |
The key address must match the address chosen in the selector; mismatch is undefined (behaviour varies by server).
Server reply (verbose — multiple lines), when successful:
M0+S3<;>
M0LS3<;>]\[Headlight]\[Bell]\[… (only if loco is in roster)
M0AS3<;>F00
M0AS3<;>F01
…
M0AS3<;>F028
M0AS3<;>V0
M0AS3<;>R1
M0AS3<;>s1
Roster entries include a function-name array (M…L…, §10.2). Ad-hoc addresses
skip the label list but still receive F / V / R / s states.
8.2 Remove locomotive — M…−
M0-S3<;>r
M0-*<;>r
| Part | Meaning |
|---|---|
−S3 |
Remove loco with key S3 |
−* |
Remove all locos on this MultiThrottle |
<;>r |
Release command (r); d = dispatch (§9.8) |
Server typically confirms:
M0-S3<;>
8.3 Steal — M…S
Used with Digitrax systems when a loco is already controlled elsewhere.
| Step | Direction | Example |
|---|---|---|
| 1 | Client → server | M0+S3<;>S3 (normal acquire) |
| 2 | Server → client | M0SS3<;>S3 (steal required) |
| 3 | Client → server | M0SS3<;>S3 (steal confirm) |
Requires JMRI ≥ 4.10 for JMRI-backed servers.
9 Throttle actions
Actions are sent as the second part of an M…A command:
M0A*<;>V30
M0AS3<;>F112
M0AL341<;>R0
locoKey before <;> may be * (all locos on throttle) or a specific S/L
key. The payload after <;> is a letter + value throttle sub-command.
9.1 Sub-command summary
| Cmd | Format | Description |
|---|---|---|
V |
V«speed» |
Speed 0…126 (§9.2) |
R |
R«dir» |
Direction: 0 = reverse, non-0 = forward |
F |
F«state»«fn» |
Function press/release (§9.3) |
f |
f«state»«fn» |
Force function on/off (§9.4) |
m |
m«mode»«fn» |
Momentary (1) vs latching (0) override (§9.5) |
s |
s«mode» |
Speed-step mode (§9.6) |
X |
X |
Emergency stop |
I |
I |
Idle — speed 0 (normal stop) |
q |
qV / qR |
Query speed / direction (§9.7) |
C / c |
C«lead» / c«lead» |
Set consist lead for function routing (§9.9) |
r / d |
r / d |
Release / dispatch (§9.8) |
E |
E«rosterId» |
Select address from roster entry |
L / S |
L«addr» / S«addr» |
Set long / short address directly |
Q |
Q |
Quit this throttle instance |
Function numbers are 0–31 without leading zeros (F10, not F010).
9.2 Speed — V
M0A*<;>V30
| Value | Meaning |
|---|---|
0 |
Stop |
1 |
Emergency stop encoding on wire |
2…126 |
Increasing speed (126 = max) |
During initialization the server may send negative speed values to indicate E-stop state (JMRI); clients should treat that as stopped / E-stop.
9.3 Function press/release — F
Momentary UI buttons send pairs:
M0A*<;>F112
M0A*<;>F012
| Field | Meaning |
|---|---|
1 / 0 after F |
Press / release (not the same as on/off for latching functions) |
| digits after | Function number |
The server maps press/release to the correct DCC behaviour (momentary whistle vs toggling headlight).
9.4 Force function — f
M0A*<;>f112
Sets absolute on (1) / off (0) regardless of prior state. Server emits M…A
notification only when the state actually changes.
9.5 Momentary vs latching — m
M0A*<;>m112
M0A*<;>m012
Overrides roster defaults: m1«fn» = momentary, m0«fn» (or any non-1) =
latching. JMRI global preference "F2 always momentary" overrides for F2.
9.6 Speed-step mode — s
M0AS3<;>s1
| Value | Step mode |
|---|---|
1 |
128 speed steps |
2 |
28 speed steps |
4 |
27 speed steps |
8 |
14 speed steps |
9.7 Query — q
M0A*<;>qV
M0A*<;>qR
Server answers with M…A notifications (V…, R…) per loco.
9.8 Release & dispatch — r / d
Usually sent as part of M…− (§8.2). On many systems release and
dispatch are equivalent; prefer r when unsure.
9.9 Consist lead routing — C / c
M0AL341<;>CL346
Directs function commands to the lead loco L346 when not using CV21/CV22
advanced consist mapping.
10 Server property notifications
Asynchronous M lines inform clients about changes (from other throttles, panels,
or automation):
M0AL341<;>F10
M0AL341<;>V23
M0AL341<;>R1
M0AL341<;>s1
10.1 Notification shape — M…A
M«id»A«locoKey»<;>«property»
property prefix |
Meaning |
|---|---|
F«state»«fn» |
Function off/on |
V«speed» |
Speed |
R«dir» |
Direction |
s«mode» |
Speed-step mode |
10.2 Function labels — M…L
M0LL7407<;>]\[Lights]\[Bell]\[Whistle]\[…
Returned after roster acquire. Delimiters: leading ]\[, between labels ]\[,
trailing ]\[. Index n in the array maps to Fn (F0 = first label).
10.3 Add/remove notifications — M…+ / M…−
M0+S3<;>
M0-S3<;>
Empty payload after <;> confirms add/remove events.
10.4 Steal prompt — M…S
See §8.3.
11 Track power
11.1 Server → client
Announced in the initial PPA line (§5.3) and on changes.
11.2 Client → server
PPA1
PPA0
Sets track power on/off where the server supports it. Not all command stations expose power control through WiThrottle.
12 Turnouts / points
12.1 Client request — PTA
PTACLT92
PTATLT92
PTA2LT92
| Segment | Meaning |
|---|---|
PTA |
Turnout command prefix |
| Action | C = closed, T = thrown, 2 = toggle |
| Name | System name (LT92) or numeric index (server picks default connection) |
JMRI may create unknown turnouts when preference allows; errors return HM…
(§16.1).
12.2 Server notification — PTA
PTA2LT92
| State digit | Meaning |
|---|---|
2 |
Closed |
4 |
Thrown |
1 |
Unknown |
8 |
Inconsistent |
Broadcast for all turnout changes on the layout, not only those requested by this client.
13 Routes
13.1 Client request — PRA
PRA2IO_RESET_LAYOUT
| Segment | Meaning |
|---|---|
PRA |
Route command prefix |
2 |
Set / activate route |
| Name | Route system name |
13.2 Server notification — PRA
PRA2IO_RESET_LAYOUT
| State digit | Meaning |
|---|---|
2 |
Active |
4 |
Inactive |
8 |
Inconsistent |
14 Consists (roster & advanced)
Two layers:
- MultiThrottle multi-loco (§7) — protocol-level list on one TCP throttle; no CV programming.
- NMRA advanced consists —
RCcommands manipulating decoder CV19 and CV21/22.
14.1 Advanced consist commands — RC
All start with RC:
| Cmd | Example | Purpose |
|---|---|---|
RC+ |
RC+<;>S74<;>My consist<:>L341<;>true |
Create / add loco to consist |
RC- |
RC-<;>S74<:>L341 |
Remove one loco |
RCP |
RCP<;>S74<:>L346<;>L3374 |
Reorder locos (lead first) |
RCR |
RCR<;>S74 |
Delete entire consist |
RCF |
(see JMRI doc) | Program CV21/CV22 function behaviour |
RC+ fields (JMRI):
RC+<;>S74<;>My consist<:>L341<;>true
| Field | Meaning |
|---|---|
| Consist address | S74 |
| Consist name | My consist |
<:> |
Separates name from first loco |
| Loco address | L341 |
| Direction | true = normal, false = reversed in consist |
Initial RCC / RCD lines (§5.7) describe existing consists.
15 Fast clock
15.1 Server → client — PFT
PFT65871<;>4
PFT1550686525<;>4.0
PFT1550681224<;>0.0
| Field | Meaning |
|---|---|
| seconds | Integer seconds since 1970-01-01 00:00:00 fast-clock calendar (timezone differs from Unix UTC; use modulo 86400 for time-of-day only) |
<;> |
Separator |
| ratio | Scale factor (4 = 4× real time). 0 / 0.0 = stopped |
Sent when rate or time changes, and roughly once per fast-clock minute while running. Digitrax LNWI may use the range 0…86400 for time-of-day only.
Extracting HH:MM:SS (JMRI style):
seconds mod 86400 → seconds since midnight
Example: 1607855025 mod 86400 = 37425 → 10:23:45.
16 Alerts, server identity & misc
16.1 Alerts & info — HM / Hm
HMJMRI: address 'L23' not allowed as Long
HmTrain 42 approaching station
| Prefix | Use |
|---|---|
HM |
Error / alert (show to user) |
Hm |
Informational |
No embedded newlines.
16.2 Server type — HT / Ht
HTJMRI
HtJMRI v4.19.8 My JMRI Railroad
Known HT types include JMRI, Digitrax, MRC. Clients may branch on these.
16.3 Unknown commands
Clients must ignore unrecognized lines and continue reading. Servers likewise ignore unknown client commands.
16.4 PFC (LNWI)
Digitrax LNWI may send a PFC line after connect; purpose undocumented in JMRI
help. Treat as ignorable.
16.5 AT+CIPSENDBUF= (LNWI artefact)
The flash62au parser strips leading AT+CIPSENDBUF= noise occasionally prepended
by LNWI firmware before the real WiThrottle payload.
17 Deprecated & auxiliary commands
17.1 Legacy single-throttle prefixes
| Prefix | Status | Replacement |
|---|---|---|
T… |
Deprecated | M0… / M«id»… |
S… |
Deprecated second throttle | M1… |
MT… |
Deprecated MultiThrottle alias | M0… |
Steal examples in older docs use MT+ / MTS; modern clients use M0+ / M0S.
17.2 Raw DCC packet — D
D«hex bytes…»
Sends a hex-encoded packet to the command station (implementation-defined). Rare in mobile clients; useful for scripting through JMRI.
17.3 Panel — P
Prefix for panel operations (handled by JMRI DeviceServer); not used by standard mobile throttles.
17.4 Roster — R
Prefix for roster operations beyond the initial RL list (server-specific).
17.5 C forward
Legacy no-op forwarding to throttle controller — not used in new clients.
18 Client implementation notes
Practices distilled from flash62au/WiThrottleProtocol and field experience:
| Topic | Recommendation |
|---|---|
| Command pacing | Minimum 50 ms between outbound commands (connect(stream, 50)); burst traffic can overwhelm JMRI or LNWI |
| Leading CRLF | Some servers (e.g. WiFi-equipped throttles) expect an extra \r\n before each command; configurable via setCommandsNeedLeadingCrLf() |
| Buffer size | Cap input lines (library default ≈ 256 bytes); log and discard overlong lines |
| Heartbeat | Call *+ after reading *«n»; send * or any command before timeout; consider re-sending N to verify server liveness |
| MultiThrottle | Use 0–5 consistently; never mix with legacy T API |
| Function state | Track F0–F31 locally — server notifications may arrive from other controllers |
Negative V |
Treat as E-stop indication during loco acquisition |
| LNWI quirks | Strip AT+CIPSENDBUF= prefix; ignore PFC; expect occasional garbage lines |
| Unknown lines | Ignore and continue — forward compatibility |
18.1 Suggested parser structure
- Read bytes until CR or LF; ignore duplicate empty lines.
- Match longest prefix first (
PFT,PTL,M0A,VN, …) — the flash62auprocessCommand()ordering is a useful reference. - For
Mmessages, branch on character index 2 (+,−,S,A,L). - Split remaining fields on
<;>then parse action letter (V,F, …).
19 BigFred mapping
BigFred implements an optional inbound WiThrottle TCP server inside the
dcc-bus daemon, symmetric to the Z21 inbound UDP server, so Engine Driver and
physical WiThrottle handsets drive through the same cmd.Router as the browser
throttle. The implementation plan is
../plans/withrottle-server.md. Layout control
otherwise uses:
| Path | Protocol | Typical hardware |
|---|---|---|
z21 |
Z21 LAN UDP 21105 | RailBOX RB1110, Roco Z21 |
withrottle |
WiThrottle TCP 12090 | Engine Driver, WiThrottle for iOS |
loconet_serial / loconet_tcp |
LocoNet | Digikeijs DR5000 + Uhlenbrock 63120 |
The RB1110 also exposes WiThrottle on TCP 12090 — see RB1110 §6.3. When BigFred owns the command station it binds its own WiThrottle port; BigFred and a vendor WiThrottle server are separate consumers of the same command station and do not share sessions.
19.0 Pairing
Authorization uses a 6-digit numeric code shown in the BigFred UI. The code is entered on the handset through one of two equivalent paths:
- Function keys — BigFred advertises a sentinel "Pair with BigFred" roster
entry to unpaired clients; the user acquires it and presses
F1…F9(one digit each) orF10…F32(two digits each) in sequence. This mirrors the Z21 function-key pairing flow. - Device name — the user sets the Engine Driver Device Name to the code
(
N122145); BigFred matches it on connect.
The HU device id is the paired client key (withrottle:<deviceId>); sessions
survive TCP reconnect without re-pairing. One pilot per user per command station
is shared across the Z21 and WiThrottle inbound servers.
19.1 Conceptual mapping
The realized mapping from WiThrottle commands to dcc-bus intents:
| WiThrottle | BigFred / DCC intent |
|---|---|
M…+ / M…− |
Loco acquire / release (cf. slot dispatch) |
M…A*<;>Vn |
loco.setSpeed (1 = emergency stop) |
M…A*<;>Fxy / fxy |
loco.setFunction |
M…A*<;>Rx |
Direction bit in loco.setSpeed |
M…A*<;>X |
Emergency stop (per loco) |
PPA |
Track power (if exposed) |
PTA / PRA |
Accessory / route (not in v1 scope) |
PFT |
Fast clock (not in v1 scope) |
RC* |
Advanced consists (not in v1 scope) |
*«n» heartbeat |
Dead-man switch: E-stop subscribed locos on timeout, then unpair |
RL |
Roster built from the paired user's allowed vehicles |
19.2 Capability snapshot
| Capability | BigFred |
|---|---|
| WiThrottle server (TCP 12090) | ✅ Optional, opt-in per command station (see plan) |
| Pairing (F-key + device-name code) | ✅ Planned |
| Roster from allowed vehicles | ✅ Planned |
| Turnouts / routes / fast clock / advanced consists | ❌ v1 ignores client cmds; not emitted |
| WiThrottle client | ❌ Not implemented |
| Coexist with Engine Driver on RB1110 | ✅ Different ports — Z21 21105 vs WiThrottle 12090 |
| Replace Engine Driver | N/A — complementary protocols |
Appendix A – Command quick reference
Client → server
| Prefix | Example | Purpose |
|---|---|---|
HU |
HU«uuid» |
Unique device ID |
N |
NMy Throttle |
Device display name |
* |
*, *+, *− |
Heartbeat / monitor control |
Q |
Q |
Quit |
M…+ |
M0+S3<;>S3 |
Acquire loco |
M…− |
M0-*<;>r |
Release loco(s) |
M…S |
M0SS3<;>S3 |
Steal loco |
M…A |
M0A*<;>V30 |
Speed / dir / functions / … |
PPA |
PPA1 |
Track power |
PTA |
PTACLT12 |
Turnout closed |
PRA |
PRA2ROUTE1 |
Set route |
RC+ |
RC+<;>S74<;>name<:>L3<;>true |
Advanced consist add |
RC− |
RC-<;>S74<:>L3 |
Consist remove loco |
RCP |
RCP<;>S74<:>L3<;>L4 |
Consist reorder |
RCR |
RCR<;>S74 |
Delete consist |
D |
D… |
Raw hex to command station |
Server → client
| Prefix | Example | Purpose |
|---|---|---|
VN |
VN2.0 |
Protocol version |
RL |
RL2]\[… |
Roster |
PPA |
PPA1 |
Track power state |
PTT / PTL |
PTL]\[… |
Turnout labels / list |
PRT / PRL |
PRL]\[… |
Route labels / list |
RCC / RCD |
RCD}|{… |
Consist list |
PW |
PW12080 |
Web port |
* |
*10 |
Heartbeat interval |
M… |
M0AS3<;>V25 |
Throttle notifications |
PFT |
PFT37425<;>4 |
Fast clock |
HM / Hm |
HM… |
Alert / info |
HT / Ht |
HTJMRI |
Server identity |
PTA |
PTA2LT12 |
Turnout feedback |
PRA |
PRA2ROUTE1 |
Route feedback |
Appendix B – Worked examples
B.1 Minimal session (short address 3)
→ HU550e8400-e29b-41d4-a716-446655440000
→ NBigFred Test
← *10
← VN2.0
← PPA1
→ *+
→ M0+S3<;>S3
← M0+S3<;>
← M0AS3<;>F00
← M0AS3<;>V0
← M0AS3<;>R1
← M0AS3<;>s1
→ M0A*<;>V20
→ M0A*<;>R1
→ M0A*<;>F11
→ M0A*<;>F01
→ M0-*<;>r
← M0-S3<;>
→ Q
B.2 Long address with roster entry
→ M0+L341<;>ED&RGW 341
← M0+L341<;>
← M0LL341<;>]\[Headlight]\[Bell]\[Whistle]\[…
← M0AL341<;>F00
…
→ M0AL341<;>V45
B.3 Turnout throw
← PTT]\[Turnouts}|{Turnout]\[Closed}|{2]\[Thrown}|{4
← PTL]\[LT92}|{Station North}|{2
→ PTATLT92
← PTA4LT92
B.4 Fast-clock time extraction
← PFT1607855025<;>4.0
1607855025 mod 86400 = 37425 seconds after midnight
37425 s = 10 h 23 min 45 s
B.5 Steal sequence (Digitrax)
| Server | Client |
|---|---|
M0SS3<;>S3 |
|
M0+S3<;>S3 |
|
M0SS3<;>S3 |
|
M0SS3<;>S3 |
Related: z21.md (Z21 LAN), loconet.md (LocoNet),
RailBOX RB1110 (WiThrottle port 12090),
JMRI WiThrottle Protocol.