Requires: ARCHITECT permission on the project.
This guide covers designing, generating, and managing object structures (OT) and data tables (DT).
Data never exists without an object. Objects can exist without data.
An OT defines what an object looks like. After generation, objects (rows) can be inserted.
| Type | Description | Required/Unique |
|---|---|---|
DISPLAY_NAME |
Object's display name | Required, unique |
DESCRIPTION |
Object description | Unique |
ADDITIONAL_DATA |
General-purpose column | — |
SIMPLE_OBJECT_IDENTIFIER |
Enum value, bit number, simple ID | — |
COMPLEX_OBJECT_IDENTIFIER |
Other identifiers | — |
FILE |
File content (text or bytea) | — |
FILE_FILENAME |
Meta: filename for a FILE column | — |
FILE_SIZE |
Meta: size for a FILE column | — |
| Flag | Description |
|---|---|
NO_HISTORY_TABLE |
Don't track object changes |
NO_ACCESS_TABLE |
Don't allow per-object permissions |
PARENT_RECURSIVE |
Parent can be from the same OT (requires PARENT_OPTIONAL) |
PARENT_OPTIONAL |
Parent reference is nullable |
DATA_ALLOWED |
Objects can have data tables |
DATA_REQUIRED |
Objects must have a data table (requires DATA_ALLOWED) |
SETTINGS_ALLOWED |
Objects can store JSON settings |
PRIVATE_ALLOWED |
Objects can be marked private (requires access table) |
PRIVATE_SUGGESTED |
Default new objects to private (requires PRIVATE_ALLOWED) |
ENUM |
Hidden in browse, no data. Use for lookup/enum tables |
Default: DATA_ALLOWED.
| Flag | Description |
|---|---|
OPTIONAL |
Column allows NULL |
AUTOINCREMENT |
Auto-generated integer (not with arrays) |
TRANSLATED |
Physical columns per project language (not with arrays) |
ARRAY_VALUE |
PostgreSQL array type |
REGEX_CASE_SENSITIVE |
Regex validation is case-sensitive |
REGEX_NEGATION |
Regex must NOT match |
MIN_EXCLUDED |
Use > instead of >= for min validation |
MAX_EXCLUDED |
Use < instead of <= for max validation |
Add unique constraints beyond the primary key. Group number determines combination: columns with group 0 form one unique key, columns with group 1 form another, etc. NULL values are ignored. You can optionally include the parent object ID in a combination group.
Generation creates physical PostgreSQL tables with all constraints (types, min/max, regex, unique keys). After generation, objects can be created. Structural changes become restricted.
OT can be deleted later (but all objects are lost). OT can also be archived, locked, or hidden.
A DT stores time-series or other frequently changing data for objects of a given OT. One OT can have multiple DTs.
| Type | Description | Required/Unique |
|---|---|---|
PRIMARY_TIME |
Primary time column (datetime, int, etc.) | Required, unique |
MAJOR_VALUE_ANALOG |
Continuous value — easy to chart | — |
MAJOR_VALUE_DISCRETE |
Discrete state changes — easy to chart | — |
MINOR_VALUE |
Secondary values (including arrays, references) | — |
VALUE_QUALITY |
Meta: quality indicator for a value column | — |
ADDITIONAL_DATA |
Misc data (positions, JSON, binary) | — |
VALUE_IDENTIFIER |
Part of primary key (sensor ID, channel) | Unique |
VALUE_MIN |
Meta: minimum of a major value column | — |
VALUE_MAX |
Meta: maximum of a major value column | — |
| Flag | Description | Default |
|---|---|---|
DATA_SOURCE |
Store the individual who inserted each row | off |
TIME_SERIES |
Enable TimescaleDB extension | on |
| Flag | Description |
|---|---|
OPTIONAL |
Column allows NULL |
ARRAY_VALUE |
PostgreSQL array type |
REGEX_CASE_SENSITIVE |
Case-sensitive regex validation |
REGEX_NEGATION |
Regex must NOT match |
MIN_EXCLUDED |
Use < instead of <= for min |
MAX_EXCLUDED |
Use > instead of >= for max |
| Setting | Description |
|---|---|
UNIT |
Display unit (e.g. °C, kPa) |
MIN_EXPECTED_VALUE |
Soft lower bound (not enforced in DB) |
MAX_EXPECTED_VALUE |
Soft upper bound (not enforced in DB) |
| Setting | Description |
|---|---|
DISCONNECT_VALUE |
JSON value inserted when source is disconnected |
DISCONNECT_TIMEOUT |
Seconds of inactivity before inserting disconnect value |
These work together: if a new data point arrives more than DISCONNECT_TIMEOUT seconds after the last one, a DISCONNECT_VALUE row is inserted first. This creates visible gaps in graph applications.
A DT column can reference an OT column of type SIMPLE_OBJECT_IDENTIFIER. Two modes:
| Mode | Description |
|---|---|
BITMASK_BITS |
DT value is a bitmask; each bit maps to an OT identifier object |
ENUM_VALUES |
DT value is an ID; maps to an OT identifier object |
This is a soft reference — existing matches are shown as text, missing values stay numeric. Resilient to changes in the referenced object set.
Makes a DT column part of the primary key. Use when one object has multiple data streams (e.g., multiple sensors on one machine, each identified by a sensor_id column).
All OT and DT columns share the same set of data types:
| Type | PostgreSQL | Notes |
|---|---|---|
OBJECT_REFERENCE |
int | FK to object. Displayed as link |
ENUM_REFERENCE |
int | FK to object. Displayed as name + ID |
BOOL |
boolean | |
SMALL_INT |
smallint | |
INT |
int | |
BIG_INT |
bigint | Caution: converted to float in PHP |
REAL |
real | |
DOUBLE |
double precision | |
VARCHAR |
character varying | Supports size limit |
TEXT |
text | |
NUMERIC_BITFIELD |
int | Unsigned integer interpreted as bitfield |
BITFIELD |
bit varying | Supports size limit |
JSON_BINARY |
jsonb | |
DATE |
date | |
TIME |
time | |
TIME_TIMEZONE |
timetz | |
DATETIME |
timestamp | |
DATETIME_TIMEZONE |
timestamptz | |
BYTE_ARRAY |
bytea | Binary data |
IP_ADDRESS |
inet | |
UUID |
uuid |
OBJECT_REFERENCE and ENUM_REFERENCE are structurally identical — both store an integer FK. The only difference is UI rendering.
| Capability | Applies to |
|---|---|
| Can be array | Everything except references and data containers |
| Can be translated | VARCHAR, TEXT |
| Can have size | VARCHAR, BITFIELD |
| Can have min/max | Numeric types, primary-time-eligible types |
| Can have regex | Numeric, pseudo-text, pseudo-textarea, datetime |
| Can be primary time | DATETIME, DATETIME_TIMEZONE, DATE, SMALL_INT, INT |
| Can be display name | VARCHAR |
| Can be file content | TEXT, BYTE_ARRAY |
Templates pre-define required columns with locked data types and flags. See Templates Overview.
With template:
Without template:
The wizard offers reasonable default types. You're responsible for structural consistency.
| State | Meaning |
|---|---|
INACTIVE |
Draft, not visible for selection |
ACTIVE |
Available for use |
DEPRECATED |
Still usable, can define a replacement version |