PhloemDocs

Where your data lives

Find, browse and query what your devices send to the cloud. It all lands in Reservoir, in one of four tables chosen by what the channel is, not which input sent it.

TableWhat's in itExample channel
scalarsNumeric and text channel data from your devices./rig/pressure
videoCamera footage and other video recordings./cam/front
geometryPoint clouds and other captures drawn in a 3D scene./lidar/points
waveformsSpectra, histograms and other value series over an axis./arm/joints/position

Other tables:

TableWhat's in it
trellis_measurementsone row per judged measurement of a test run
trellis_verdictsinterlock trips, check verdicts and run outcomes
trellis_commandscommands Trellis sent to outputs
occurrencesmarks and alarms — see below

occurrences has one row per event: a mark's instant, a span's start and end, an alarm firing. Each row says who set up the detector (origin: a deployed setup, a run's recipe, a Pipelines rule, a notebook, or a person) and what to open to edit it. An alarm row also has severity and notify (who to tell; empty on a close and on a shelved firing). An interlock trip is never here; it is a trellis_verdicts row.

Rollups and the Search index are built for you. They appear in the table list so you can see their size.

Browse it

Open Reservoir → Explore. Pick a table, then a channel, on the left. You see rows, footage or a 3D preview, depending on the table.

The SQL strip above already holds the query for your selection. Edit it and press Run to ask anything else. The URL keeps the table, channel and query, so you can share the exact view as a link.

Query it

Every table has three shared columns: path (the channel), device_id, and event_time (the source clock, in UTC). Use them to line tables up: the same path and event_time in geometry and video is the same instant.

Recent samples from one channel:

SELECT event_time, f64
FROM scalars
WHERE path = '/rig/pressure'
ORDER BY event_time DESC
LIMIT 100

scalars holds one value per row, in the column for its type: f64, i64, bool, text or bytes. producer says which input or derived step sent it. time_basis says whether event_time is the sensor's clock or the arrival time.

Which channels exist, and how much of each:

SELECT path, count(*) AS samples
FROM scalars
GROUP BY path
ORDER BY samples DESC

A waveform row is a whole array at one instant: values, plus its axis — axis_name, axis_unit, and either axis_labels for named slots like J1…J6 or axis_start/axis_step for evenly spaced bins.

SELECT event_time, axis_labels, values
FROM waveforms
WHERE path = '/arm/joints/position'
ORDER BY event_time DESC
LIMIT 10

Footage has one row per chunk. dur_us is the chunk length in microseconds; codec is how it was encoded:

SELECT event_time, dur_us, codec
FROM video
WHERE path = '/cam/front'
ORDER BY event_time DESC
LIMIT 20

Geometry rows have archetype (what to draw: points3d, boxes3d, segmentation_image, transform3d, …) and frame_id (the coordinate frame the capture belongs to).

Note

A channel whose input never said what it is lands in the bytes column of scalars. You can still query and replay it, but it gets no chart, player or 3D preview. Set the channel's kind where it is sent, and the next sample lands in the right table.

Old data is deleted on the schedule you set: see Retention.

Updated