LMU API test page

busy unknown maintenance unknown firmware unknown
not connected not logged in

Log in

Login is POST /api/User/Token (form-urlencoded); every call after that carries Authorization: Bearer. The token stays in this browser tab, the password is not stored. A cloud token is valid for 60 minutes.

Live camera

Robot (SAODF)

Actions

|
s off camera light in the cabinet; the robot switches it off by itself after the time you give

Create campaign

Tap ✕ to remove a command; tap the text to edit it. Jobs run in this order.

Build a line

The ports of the selected robot are loaded into the port picker.

Options

Robot queue

-- log in first --
PosJobCommandStatusPrioHeld until (UTC)Details
nothing loaded yet

Alarms

-- log in first --
IdStateSeverityAppeared (UTC)WhatDetailRef
nothing loaded yet

Campaigns and status

IdNameCreatedScheduled (UTC)JobsStatusPrio
nothing loaded yet

OTDR traces

nothing downloaded yet
TestIdPortStartedEndedStatusFileTrace
nothing loaded yet
How it works · error codes
The trace comes through the API as bytes, not as a presigned URL, and the call carries the bearer token — so the file is fetched and handed to the browser as a download; it lands in your normal download folder. 409 means the test exists but has no trace yet (Pending, or Failed), 404 that there is no such test or the key points at an object that is gone, 502 that S3 refused and 503 that no bucket is configured (local mode). With a port filled in the list comes from GET /api/TestResult/{port}/OTDR, which filters on TEST_TYPE = 1: measurements from before 2026-09-01 carry NULL there and stay out of it — leave the port empty to see those too.

OTA firmware update

idle
unknown

Network (IP, subnet, gateway, MAC)

unknown
idle
fill in only what changes; an empty field keeps its value on the robot
How a change works
Needs firmware 5.0.5.0 or newer. The API checks every field (422) and refuses an IP or MAC that another robot already has (409). The robot checks again, also that its core stays in the subnet, and refuses without changing anything (the reason is on its status topic, in CloudWatch /gigacom/robots/{id}). It restarts on the new settings; if it cannot reach its core within 5 minutes it puts the old ones back and restarts again, so a typo costs about six minutes offline. Only the IP comes back over HTTP, so only an IP change can be followed here.

Slot data (Excel)

nothing exported yet the full slot data of the selected robot, in the shape the import reads back

Import

no file
How it works · error codes
Export and import are two halves of one round trip: export, edit in Excel, import back. 404 ROBOT_NOT_PROVISIONED means there is no StationMaster row for this robot, 422 WORKBOOK_FORMAT that the sheets are not what the parser expects, and 422 SHAPE_MISMATCH that the file does not fit the provisioned shape of this robot. FILE_LARGER_THAN_SYSTEM means the file has more doors than the robot: with allow_grow the import makes the robot that size. The robot gets its extra doors in the sync from firmware 5.0.6.0 on.

Configuration

Storage thresholds (cord alarms)

-- log in first --
ModuleOperator (PLC)Stored / slotsRow ARow BAppliesAlarm now
nothing loaded yet
How thresholds work

Robot (SAODF)

-- log in first --
nothing loaded yet

Site settings (dbo.WinServiceSettings)

One row for the whole site; the columns are those of this database. In bold: the four this API reads (rounds per campaign and the minutes between two rounds, each for a normal and a priority campaign); the rest is read by the LMU app.
nothing loaded yet

Free request

Useful paths: /api/version, /api/Port/1?limit=20, /api/Active/Operators, /api/TestProfile/, /api/Configuration/, /api/Alarm/?limit=20, /docs in a new tab.

Request log

Add cord

-- log in first --
Registers a cord that is already patched: one row in Cords and the occupancy of its slots. The robot does not move, and no sync is needed: the backend chooses every slot of a DC, IC or CC itself and sends the slot numbers in the command, so the firmware never reads the occupancy. Side A decides the type: an ACTIVE_NAME makes an IC, a port makes a CC. Splitter inputs (…_IN) are not offered: an IC goes from a splitter output.

Alarm details

Free text, as in the alarm edit screen of the LMU app; an empty field is cleared. What the API itself uses while the alarm is open stays greyed out until it is closed (hover a grey field for why). API 0.0.78 or later.

Remove cord

-- log in first --
Records a cord that was pulled out by hand: its Cords row becomes REMOVED and its slots are free again (an IC clears its one slot, a CC both). The robot does not move. Refused (409) while a DC, IC or CC of this robot is running, or while a job that has not ended names one of the cord's ports; the message names the job. API 0.0.55 or later.

Dustcap

-- log in first --

Ports and cords

-- log in first --
normal parking storage CC cord (to another port) IC cord (to an operator's Active)
Click a port to see where its cord goes.
How to read the map
From GET /api/Port/{id}, the list that also fills the port pickers. One column per section (the letter of the module in SAODFPORT_DETAIL1), one line per row of consecutive slots, in slot order: so row A 1–20 sits next to row B 21–40. ConnectedSaodfPort is the other end of the live cord: a port of this robot for a CC, an ACTIVE_NAME for an IC. Read-only.

Next cord per operator

-- log in first --
How to read this table
Which stored cord an interconnect (IC) takes next, per rack section: the same choice an IC job makes. Grouped by rack section; one row per operator that has storage slots in it. Used for IC into names the sections whose IC takes that cord: its own, and the paired one (1↔2, 3↔4) when the pair has none of this operator's cords itself. Read-only.
OperatorStorage modulesNext cordCord id LeftUsed for IC into
nothing loaded yet

Calibration

no changes to sync
Everything here writes the database only. The robot uses it after Sync to robot (POST /api/sync/{id}). Offsets are relative: applying one twice moves twice.

Home positions · absolute, mm

homePosX1 is used by rack sections 1-4, X2 by 5-8, X3 by 9 and up. At most 4 decimals.

Offset · relative, mm

slots to
y also moves YHoldCord and YDrumPosition of the normal slots; yHoldCord and yDrum on their own move only those two, and cannot be combined with y. Slot offsets take 6 decimals, a door's x, y and z 4. A door offset with x also moves the drum center (Section_X-Position) of both its sections.

Sections

RackDoorSectionIdHome XX beginX end Y beginY endZDrum center
Hover a row for all ten section parameters.

Parameters · absolute

The station parameters and the ten of every rack section, numbered as in the slot-data workbook and the sync (the firmware's params[number - 1]). Only the values you change are sent; at most 4 decimals. One unknown key refuses the whole save and nothing changes.
Station #CodeDescriptionValue
nothing loaded yet
Section #CodeDescription
nothing loaded yet

Automatic X/Y calibration · calibration plates

How a calibration run works
First import the theoretical slot data (Slot data (Excel)), then set the home positions above until the robot touches the plates, and sync. The run starts from the slot data the robot has then: it measures three calibration plates per row (columns 1, 9 and 19; the gripper stands one slot to the right, at 2, 10 and 20, because the sensor sits one dustcap left of it) with the sensor in the gripper, writes those values plus the measured deviation, syncs, and measures again until every row is within tolerance. Maintenance mode is not needed for now: keep campaigns off the robot yourself. Put the plates in every module of the run, then Continue once: the modules follow one after the other. Rows that are not verified go back to their values from before the run. A run writes X, Y and Z of the slots only; YHoldCord, YDrumPosition and the section values stay as they are (API 0.0.80).
—
Hold to close closes step by step while you hold it.
loading…
Raise X when the sensor stands left of the plate, lower it when it stands right of it.
no run
ModuleRowPlatesResultResidual per round (mm)Last dx / dy / dz (mm)
no run