Operate
gripper head unknown
Vision
Gripper crash
Every move refuses while the gripper head is off its seat, the home too. Retract moves only Zg slowly back until the head sits again; then Home.
Every move refuses while the gripper head is off its seat, the home too. Retract moves only Zg slowly back until the head sits again; then Home.
Live
Fleet
Log in to see the robots
Robots
Where this comes from
Busy, maintenance, pause and firmware are the columns of
GET /api/SAODF/, as in the top bar.
Offline is an open ROBOT_IS_OFFLINE alarm, since the time it appeared (UTC, as in
the alarm list; the real outage can be a few minutes earlier). Alarms counts the other open alarms
(NEW and ACKNOWLEDGED) of a robot, the maintenance alarm included. Enter in the search opens the robot
when one is left; Esc clears it. Queues is GET /api/queue/ (API 0.0.90): every robot
whose job queue has an open job, a runner, a reason it waits or a halt. Active is a robot that is
executing a job: one in flight in its queue, or busy (SaodfIsActive).
Queues –
Every job queue in use in the fleet, running first.
Open alarms
Newest first, for the robots in the fleet selection.
| Robot | Alarm | Since (UTC) |
|---|---|---|
| nothing loaded yet | ||
Live camera
only the robot selected at the top; switching robots switches the picture
s
off
Vision check vision unknown
ROI: the one of the model
| Time | Job | Check | Slot | Mode | Verdict | Score | Reason | |
|---|---|---|---|---|---|---|---|---|
| nothing loaded yet | ||||||||
Robot queue
-- log in first --
| Pos | Job | Command | Status | Prio | Held until (UTC) | Details | |
|---|---|---|---|---|---|---|---|
| nothing loaded yet | |||||||
Robot
Movementmoves
Manual movementmoves
Left and up go towards the axis's home, right and down away from it. One step a click: X and Y the step size, Zg, Zt, R and G at most 10. Ctrl Space = STOP. Always, without a home; nothing keeps it out of the rack.
Dustcapsmoves
Cords and ports
Robot details
Create campaign
Tap ✕ to remove a command; tap the text to edit it. Jobs run in this order.
Load .txt… (or drop a .txt on this card): one command per line; empty lines and lines that start with # are skipped.
Build a line
The ports of the selected robot are loaded into the port picker.
One job, starts now, not prioritized. Full adds more jobs, an example, a schedule or priority.
Random test
Ports at random over the whole rack, from the ports that are available now: the same slot, cord and dustcap selection as Create campaign, with the open jobs of the robot counted as done. The commands join the list; nothing is sent before Create campaign.
Options
Alarms
-- log in first --
| Id | State | Severity | Appeared (UTC) | What | Detail | Ref | |
|---|---|---|---|---|---|---|---|
| nothing loaded yet | |||||||
Campaigns and status
| Id | Name | Created | Scheduled (UTC) | Jobs | Status | Prio | |
|---|---|---|---|---|---|---|---|
| nothing loaded yet | |||||||
Campaign
How a retry works
Same CampaignId: the execution is stopped and started again over all jobs, the
ones that already passed included.
CampaignAttempted goes back to 0, otherwise an OT job gets no
retry round. Empty time = now. Untick IsDeleted false to keep jobs you deleted per order out of the run.| Order | Command | Status | Details | Rounds | Executed | Running |
|---|
OTDR traces
nothing downloaded yet
| TestId | Port | Started | Ended | Status | File | Trace | |
|---|---|---|---|---|---|---|---|
| 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.Calibration
Home positions, offsets, parameters and the automatic X/Y/Z run with the calibration
plates. It writes the database; Sync to robot loads it into the firmware. The automatic run makes the robot move.
OTA firmware update
idle
unknown
Network (IP, subnet, gateway, MAC, server)
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.
Server is the core the robot connects to (firmware 5.0.6.33 or newer; kept on the robot next to
its IP). The robot must be known there, as a client device of that core; otherwise the same 5 minutes
bring it back to the old server. The server it runs on is in every answer of
Ask robot for network (broker, in CloudWatch).Camera
unknown
How it works
Connect writes
rtsp://{Camera IP}:5005/routecam into CameraStreamURL,
the address into SAODF_CAMERA_IP and CameraId, and the IVS stage
saodf-{id}-routecam into SAODF_IVS_STAGE_ARN. The robot keeps the stage it has
(existing), a stage of that name that is not in the database yet is taken over (adopted), else one
is made (created); safe to repeat. The cloud cannot reach the camera, so the address is not checked
here: press Watch on Operate. That works without a deployment once the robot is a client device of its
core (CamPublisher 1.0.5 or newer), and the core puts the camera on 720p at the first start. 409 means the
address or the stage belongs to another robot; 403 needs an admin profile.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
Robot (SAODF)
-- log in first --
nothing loaded yet
Storage thresholds (cord alarms)
-- log in first --
| Module | Operator (PLC) | Stored / slots | Row A | Row B | Applies | Alarm now |
|---|---|---|---|---|---|---|
| nothing loaded yet | ||||||
How thresholds work
Storages: 4 or 8 per door, and their operator
nothing loaded yet
| Storage | Door | Slots | Operator | Stored / free | Threshold | Alarm now |
|---|---|---|---|---|---|---|
| nothing loaded yet | ||||||
How storages work
A storage module (AS1, AS2, BS1, BS2 at door 1) is two rows of 20 storage slots. With 4 storages per door the
module is the storage; with 8 each row is a storage of its own (AS1-1 the top row, AS1-2 the one below) with its
own cord alarm, its own threshold entry (row A, row B above) and its own operator. The choice is per door
(
PATCH /api/SAODF/{id}/doors/{door}, the four SAODF_STORAGE columns of the door together);
4 to 8 always goes, 8 to 4 only when both rows of every module have the same operator. Operator gives the
storage to an operator (PUT /api/SAODF/{id}/storages/{storage}/operator: every slot gets its PLC id as
SlotType); a storage with cords in it keeps its operator until they are out. Nothing goes to the robot: the firmware
knows slots, not storages or operators. Both need an admin profile. The cord alarms are recomputed right after.
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
Operator colours (port map)
The colour of the IC cords of each operator on the port map; the CCs stay green. Stored in
Operators.OPERATOR_COLOR and saved as soon as you pick one. Default gives the operator a colour
of the page's own palette.nothing loaded yet
Users
| Id | Name | Profile | Detail 1 | |
|---|---|---|---|---|
| nothing loaded yet | ||||
New user
How users work
A user logs in on this page and on every call to the API (
POST /api/User/Token).
Creating and deleting needs a login with an admin profile (403 otherwise); the profile decides what the new
user may do. The password is stored hashed, so a user made here cannot log in to the old LMU app, and the
users of that app cannot log in here until they get a new password (PATCH /api/User/{id}).
A user with cords or alarms on their name cannot be deleted (409).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.