Status & Data Streams¶
The Gateway pushes a status frame to every connected client once per second. This is the low-level telemetry channel today; richer sensor streams are added as the Gateway grows.
Status frame¶
{ "type": "status", "battery": 95, "mode": "walk", "warning": null }
| Field | Type | Notes |
|---|---|---|
battery |
integer 0–100 |
Percent charge |
mode |
string | damp, prep, walk, custom, protect |
warning |
string | null |
Set when the robot reports a problem; null otherwise |
Clients should treat status as the single source of truth for the robot's mode and health, and update their UI from it (the app drives its mode buttons, battery indicator, and warning banner directly from these frames).
Consuming the stream¶
import asyncio, json, websockets
async def watch():
async with websockets.connect("ws://192.168.10.101:8765/ws") as ws:
async for raw in ws:
msg = json.loads(raw)
if msg.get("type") == "status":
print(msg["battery"], msg["mode"], msg["warning"])
asyncio.run(watch())
Roadmap for telemetry¶
Planned additions to the stream include joint states and IMU data, and a separate camera feed (WebRTC/RTSP) from the robot's head. Direct low-level DDS pub/sub (raw motor and IMU data, per-motor control) remains available on the robot through the uMe on-board SDK — see C++ / On-board SDK. It is intentionally not exposed over the app-facing Gateway, because DDS is a LAN protocol that is impractical on iOS/Android. See Architecture.