Object properties
Object properties
Everything a task matches is an object with properties. A matched asset knows its
name, its template and its categories; an attribute knows its engineering units; an
event frame knows when it started and how long it has been running; every row knows its
own timestamp.
This page lists all of them, in one place, with what each one resolves to.
Two places you use them
The same properties, written two ways:
| Where | How it is written | What comes back |
|---|---|---|
| A mapping column, or its table / document name | [a1.uom]: a token, in brackets | The resolved text in the cell |
| A condition | a1.uom: the bare words | A Python value |
In a condition: a property of an object
A condition is Python. The whole line is code, so a key is simply an object and a
property is read off it with a dot: nothing marks where it starts, because everything
around it is code too:
keep = a1.name == 'Pump101' and a1.value > 40a1 is the object, .name is its property, and what comes back is a Python value you
can compare, slice or test: a string, a number, a datetime, a list.
In a mapping: a token inside a dynamic string
A mapping cell is not code. It is a string that is rebuilt on every row, and it may
hold literal text, one token, or several, so the brackets are what say this part is a
token and the rest is text:
| Value | Resolves to |
|---|---|
[a1.uom] | bar |
Line 3 Β· [e1.name] | Line 3 Β· Pump101 |
[e1.name]_[a1.uom] | Pump101_bar |
Without the brackets there would be no way to tell Line 3 from a key called Line.
The same string builds the output's table name or document name, which is how
one run writes several targets; see
Table name and partitioning.
One consequence: a cell holding one token keeps that value's own
type, so [a1.value] can fill a double column. Add anything else: another token, a
space, a word, and the cell becomes text.
So the tables below carry both spellings: the token a mapping writes, and the expression
a condition writes.
A calculation is a different thing
A calculation does not read objects. Its script receives the
variables you declare (scalars, or timeseries dataframes) and assigns results
to output variables. Those results then become keys a mapping can name ([y1.value]),
which is the row for Calculation result below.
You do not have to type them
The mapping's Help button, beside Rebuild mapping, and the Conditions tab's
Example button open these same tables in the console. In the condition editor,
typing . after a key offers its properties with their data types.
The rules that catch people out
A property the key does not have resolves to nothing: an empty cell in a mapping,None in a script, rather than raising an error. An element has no engineering
units, so asking for them is a fact about the model rather than a mistake.
It does mean a typo is silent, and it matters most in a mapping: a non-nullable
numeric column renders an empty cell as 0, which reads exactly like a measurement.
A token with no property means the obvious one. [a1] is the reading, [e1] the
name.
Properties are read-only in a script. Assigning to one raises.
A key whose name is not a valid Python word is reached through keys in a script:keys['5'].
The properties
Scope
The row, page and run context. Available on every task, whatever its sources.
| Property | Type | What it resolves to | In a mapping | In a condition |
|---|---|---|---|---|
gmttime | datetime | this row's time, UTC; use this for naming | [scope.gmttime] β 2026-10-20 13:05:07 | scope.gmttime = 2026-10-20 13:05:07 |
lcltime | datetime | this row's time, server-local | [scope.lcltime] β 2026-10-20 08:05:07 | scope.lcltime = 2026-10-20 08:05:07 |
utcsec | number | this row's time, epoch seconds | [scope.utcsec] β 1792501507 | scope.utcsec = 1792501507 |
utcmsec | number | this row's time, epoch ms | [scope.utcmsec] β 1792501507000 | scope.utcmsec = 1792501507000 |
index | number | row index within the page | [scope.index] β 417 | scope.index = 417 |
page | number | page number within the run | [scope.page] β 1 | scope.page = 1 |
Tag
A channel variable: the tag or AF attribute it binds to.
| Property | Type | What it resolves to | In a mapping | In a condition |
|---|---|---|---|---|
value | object | the reading: the default if you name no property | [x1.value] β 42.7 | x1.value = 42.7 |
lcltime | datetime | the reading's time, server-local | [x1.lcltime] β 2026-10-20 08:05:07 | x1.lcltime = 2026-10-20 08:05:07 |
gmttime | datetime | the reading's time, UTC | [x1.gmttime] β 2026-10-20 13:05:07 | x1.gmttime = 2026-10-20 13:05:07 |
utcsec | number | the reading's time, epoch seconds | [x1.utcsec] β 1792501507 | x1.utcsec = 1792501507 |
utcmsec | number | the reading's time, epoch ms | [x1.utcmsec] β 1792501507000 | x1.utcmsec = 1792501507000 |
name | text | the bound AF/PI objectβs name, not the variable name | [x1.name] β BA:CONC.1 | x1.name = 'BA:CONC.1' |
description | text | the objectβs description | [x1.description] β Reactor concentration | x1.description = 'Reactor concentration' |
uom | text | engineering units, where the object has them | [x1.uom] β % | x1.uom = '%' |
id | text | the object identifier: a PI PointID on a tag, an AF UniqueID on an attribute | [x1.id] β 9 | x1.id = '9' |
Attribute
A pattern attribute: its reading, and the AF facts about it.
| Property | Type | What it resolves to | In a mapping | In a condition |
|---|---|---|---|---|
value | object | the reading: the default if you name no property | [a1.value] β 42.7 | a1.value = 42.7 |
lcltime | datetime | the reading's time, server-local | [a1.lcltime] β 2026-10-20 08:05:07 | a1.lcltime = 2026-10-20 08:05:07 |
gmttime | datetime | the reading's time, UTC | [a1.gmttime] β 2026-10-20 13:05:07 | a1.gmttime = 2026-10-20 13:05:07 |
utcsec | number | the reading's time, epoch seconds | [a1.utcsec] β 1792501507 | a1.utcsec = 1792501507 |
utcmsec | number | the reading's time, epoch ms | [a1.utcmsec] β 1792501507000 | a1.utcmsec = 1792501507000 |
id | text | AF UniqueID: the same value as guid, not a second identifier | [a1.id] β A3F0C1E2-... | a1.id = 'A3F0C1E2-...' |
name | text | the object name | [a1.name] β Pressure | a1.name = 'Pressure' |
path | text | full path | [a1.path] β \\AF01\Plant\Pump101|Pressure | a1.path = '\\AF01\Plant\Pump101|Pressure' |
description | text | description | [a1.description] β Discharge pressure | a1.description = 'Discharge pressure' |
template | text | AF template | [a1.template] β PumpAttribute | a1.template = 'PumpAttribute' |
categories | text | AF categories | [a1.categories] β Process | a1.categories = ['Process'] |
uom | text | engineering units | [a1.uom] β bar | a1.uom = 'bar' |
datatype | text | value type | [a1.datatype] β Double | a1.datatype = 'Double' |
Element
A matched asset. Facts only: an element carries no reading.
| Property | Type | What it resolves to | In a mapping | In a condition |
|---|---|---|---|---|
id | text | AF UniqueID: the same value as guid, not a second identifier | [e1.id] β E77B12D4-... | e1.id = 'E77B12D4-...' |
name | text | the object name | [e1.name] β Pump101 | e1.name = 'Pump101' |
path | text | full path | [e1.path] β \\AF01\Plant\Pump101 | e1.path = '\\AF01\Plant\Pump101' |
description | text | description | [e1.description] β Feed pump, line 1 | e1.description = 'Feed pump, line 1' |
template | text | AF template | [e1.template] β Pump | e1.template = 'Pump' |
categories | text | AF categories | [e1.categories] β Rotating; Critical | e1.categories = ['Rotating', 'Critical'] |
TimeFrame
An event frame: its facts, its span, and how far into it a row sits.
| Property | Type | What it resolves to | In a mapping | In a condition |
|---|---|---|---|---|
id | text | AF UniqueID: the same value as guid, not a second identifier | [tf1.id] β F21C88A0-... | tf1.id = 'F21C88A0-...' |
name | text | the object name | [tf1.name] β BATCH-1743 | tf1.name = 'BATCH-1743' |
path | text | full path | [tf1.path] β \\AF01\Plant\BATCH-1743 | tf1.path = '\\AF01\Plant\BATCH-1743' |
description | text | description | [tf1.description] β Production batch | tf1.description = 'Production batch' |
template | text | AF template | [tf1.template] β S88Procedure | tf1.template = 'S88Procedure' |
categories | text | AF categories | [tf1.categories] β Production | tf1.categories = ['Production'] |
persist | text | persistence setting | [tf1.persist] β None | tf1.persist = 'None' |
startutcmsec | number | frame start, epoch ms | [tf1.startutcmsec] β 1792497170000 | tf1.startutcmsec = 1792497170000 |
startutcsec | number | frame start, epoch seconds | [tf1.startutcsec] β 1792497170 | tf1.startutcsec = 1792497170 |
startgmt | datetime | frame start, UTC; use this for naming | [tf1.startgmt] β 2026-10-20 11:52:50 | tf1.startgmt = 2026-10-20 11:52:50 |
startlcl | datetime | frame start, server-local | [tf1.startlcl] β 2026-10-20 06:52:50 | tf1.startlcl = 2026-10-20 06:52:50 |
endutcmsec | number | frame end, epoch ms: 2050-01-01 while the frame is open | [tf1.endutcmsec] β 2524608000000 | tf1.endutcmsec = 2524608000000 |
endutcsec | number | frame end, epoch seconds: 2050-01-01 while open | [tf1.endutcsec] β 2524608000 | tf1.endutcsec = 2524608000 |
endgmt | datetime | frame end, UTC: 2050-01-01 while the frame is open | [tf1.endgmt] β 2050-01-01 00:00:00 | tf1.endgmt = 2050-01-01 00:00:00 |
endlcl | datetime | frame end, server-local: 2050-01-01 while open | [tf1.endlcl] β 2049-12-31 19:00:00 | tf1.endlcl = 2049-12-31 19:00:00 |
durationmsec | number | how long the frame ran, ms: elapsed so far while open | [tf1.durationmsec] β 4337000 | tf1.durationmsec = 4337000 |
durationsec | number | how long the frame ran, seconds | [tf1.durationsec] β 4337.0 | tf1.durationsec = 4337.0 |
duration | text | how long the frame ran, as 01:00:00 or 1.01:01:01 | [tf1.duration] β 01:12:17 | tf1.duration = '01:12:17' |
elapsedmsec | number | time since this frame started, at the row, ms | [tf1.elapsedmsec] β 4337000 | tf1.elapsedmsec = 4337000 |
elapsedsec | number | time since this frame started, at the row, seconds | [tf1.elapsedsec] β 4337.0 | tf1.elapsedsec = 4337.0 |
elapsed | text | time since this frame started, at the row, as [d.]hh:mm:ss | [tf1.elapsed] β 01:12:17 | tf1.elapsed = '01:12:17' |
Calculation result
A value the script assigned. It has no other property.
| Property | Type | What it resolves to | In a mapping | In a condition |
|---|---|---|---|---|
value | number | the computed value: a calc output has no other property | [y1.value] β 88.4 | y1.value = 88.4 |
Where each kind comes from
| Kind | Where its keys come from |
|---|---|
| Scope | Always present. No source declares it. |
| Tag | The Channels tab: each channel variable you declare |
| Element, Attribute | The asset pattern the task runs over |
| TimeFrame | The TimeFrame pattern, when event frames are a source |
| Calculation result | The Calculation tab's output variables |
What's Next
- Mapping: columns built out of these tokens
- Conditions: a filter written out of these properties
Related
- Calculation: declared variables and their results, which a
mapping can then name - Tasks: the pipeline all of this sits inside