Data Model

Overview

All data is organized in a three-level hierarchy:

Module
  └─ Property (one or many per module)
       └─ Element (one or many per property)

Connection and initial state

On connection, send a DU request (see Client → Server).
The server replies with a full dump message (d) containing all modules, controller data, and file lists.


Modules

A module represents a functional subsystem (focus, guiding, allsky camera, etc.).
Its identifier is its internal name (no spaces).

FieldTypeDescription
infos.labelstringHuman-readable module label
infos.namestringInternal module name
infos.descriptionstringModule description
infos.templatestringModule template/type (e.g. "focus", "guider")
propertiesobjectMap of property name → property object
globallovsobjectMap of LOV key → LOV object (module-level lists of values)
profile.namestringCurrently active profile name
profile.changedboolWhether the profile has unsaved changes
Wire format

In the JSON wire format, properties is abbreviated as p, globallovs as l, and profile as f. Clients must handle these abbreviated keys.


Properties

A property groups related elements. Properties are displayed hierarchically using level1 and level2.

FieldTypeDescription
labelstringDisplay label
orderstringSort order within the same level
level1stringFirst hierarchy level (e.g. tab name)
level2stringSecond hierarchy level (e.g. group name)
statusint0 Standby · 1 OK (green) · 2 Busy (yellow) · 3 Error (red)
permissionint0 Read-only · 1 Write-only · 2 Read-write
enabledboolWhether the property can be interacted with
badgeboolWhether the property is in the favourites list
preicon1stringIcon before the label (Google Fonts icon name)
preicon2stringSecond icon before the label
posticon1stringIcon after the label
posticon2stringSecond icon after the label
showEltsboolWhether element values should be shown inline
hasprofileboolWhether the property is saved in profiles
freevaluestringArbitrary free-text field
ruleintBool element grouping rule: 0 OneOfMany (radio) · 1 AtMostOne · 2 Any
elementsobjectMap of element name → element object

Grid properties (when hasGrid: true):

FieldTypeDescription
hasGridboolProperty has tabular grid data
showGridboolGrid should be shown by default
gridLimitintMaximum number of grid rows
gridheadersstring[]Column order (element names)
gridarray of arraysGrid rows; each row is an array of values in gridheaders order

Graph properties (when hasGraph: true):

FieldTypeDescription
hasGraphboolProperty has a graph
graphTypestring"XY" · "DY" (time-axis) · "PHD" (guiding)
graphParamsobjectGraph configuration
Wire format

In the JSON wire format, elements is abbreviated as e.


Elements

An element holds a single typed value. There are 11 element types.

Common fields (all elements, in full dump)

FieldTypeDescription
typestringElement type (see list below)
labelstringDisplay label
orderstringSort order within the property
hintstringTooltip/help text
autoupdateboolInternal backend flag; not used by clients
badgeboolWhether the element is in the favourites list
directeditbooltrue = send SV on change; false = batch with SA
preiconstringIcon before the element (optional)
posticonstringIcon after the element (optional)
Partial updates

In ee and ea update messages, elements contain only their value — no metadata fields. Clients must preserve metadata from the last full dump.


Type: int

FieldTypeDescription
valueintCurrent integer value
minintMinimum allowed value
maxintMaximum allowed value
stepintIncrement step
formatstringDisplay format string
sliderint0 no slider · 1 slider only · 2 slider + value input
listOfValuesobjectOptional: {"key": "Label"} map of allowed values
globallovstringOptional: key referencing a module or controller LOV
lovScopestring"module" or "controller" — where the globallov is defined
lovConstrainedboolWhether value must belong to the LOV

Type: float

Same fields as int, with floating-point value, min, max, step.

Type: bool

FieldTypeDescription
valuebooltrue or false

Type: string

FieldTypeDescription
valuestringText value
listOfValuesobjectOptional: {"key": "Label"} map of allowed values
globallovstringOptional: key referencing a LOV
lovScopestring"module" or "controller"

Type: date

FieldTypeDescription
valueobject{"year": int, "month": int (1-12), "day": int (1-31)}

Type: time

FieldTypeDescription
valueobject{"hh": int, "mm": int, "ss": int, "ms": int}
usemsboolWhether milliseconds should be displayed

Type: datetime

FieldTypeDescription
valueobject{"year": int, "month": int, "day": int, "hh": int, "mm": int, "ss": int, "ms": int}

Type: img

The value field is an object with image metadata:

FieldTypeDescription
urljpegstringRelative path to JPEG image (use with /ostmedia/ base URL)
urlfitsstringRelative path to FITS file
urlthumbnailstringRelative path to thumbnail
urloverlaystringRelative path to overlay image
channelsintNumber of colour channels
width / heightintImage dimensions in pixels
snrfloatSignal-to-noise ratio
hfravgfloatAverage HFR (half-flux radius) of detected stars
starsintNumber of detected stars
issolvedboolWhether plate solving succeeded
solverra / solverdefloatSolved RA/Dec coordinates
solverorientationfloatSolved field rotation angle
min / max / mean / median / stddevfloat[]Per-channel statistics
histogramarrayPer-channel histogram data
alternatesstring[]Optional: alternative versions of the image
Media URLs

All image/video paths are relative. Prepend http(s)://hostname/ostmedia/ to get the full URL.
Example: "urljpeg": "Focus/frame.jpeg"http://hostname/ostmedia/Focus/frame.jpeg

Type: video

FieldTypeDescription
valueobject{"url": "relative/path/to/video.mp4"}

In partial update (ea) messages, the video element may contain url directly at the element level rather than nested in value.

Type: light

FieldTypeDescription
valueint0 Standby · 1 OK · 2 Warning · 3 Error

Type: prg

FieldTypeDescription
valueobject{"value": float (0–100), "dynlabel": string}
prgtypestring"bar" or "spinner"

Type: message (not yet implemented in current backend)

Reserved for log/message display.


Lists of Values (LOV)

LOVs provide a set of allowed values for int, float, and string elements.

Local LOV — embedded in the element:

"listOfValues": {
  "1": "Option One",
  "2": "Option Two"
}

Global LOV — referenced by key:

"globallov": "myCameraModels",
"lovScope": "module"

The LOV itself is defined at module level (globallovs) or controller level (controllerlovs):

"myCameraModels": {
  "label": "Camera models",
  "type": "string",
  "values": {
    "ASI294MC": "ZWO ASI 294 MC",
    "ASI533MC": "ZWO ASI 533 MC"
  }
}

Built-in controller LOVs (always available):

KeyContents
loadedModulesAll loaded modules: {moduleName: label}
loadedModules-<template>Modules filtered by template (e.g. loadedModules-focus)
profiles-<template>Available profiles for a module type

Access control

The dump response includes grant-server and grant-client values:

ValueMeaning
"1"Full read-write access
"0"Read-only
"-1"Access denied (login required)

If grant-client is "-1", no module data is sent. Use the LO (login) message to authenticate.