Skip to content

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.