Skip to main content
Logic blocks are the building components of FTT workflows. Each block performs a specific operation. You connect blocks on the canvas to create the testing logic for your equipment. This page is a block-type reference. For how a finished workflow decides pass or fail, see What is Functional Testing?. For end-to-end custom authoring, see the Workflow creator guide. Most sites start with the workflow library before they edit blocks.

Write blocks

Write blocks issue commands (overrides) to device points. Each write block activates as soon as data flows into its trigger input. The trigger accepts number, boolean, or string data observations. Use write blocks to command equipment during test sequences, such as closing a damper or turning on a fan.

Command actions and priority levels

Cloud BMS uses a BACnet-inspired priority model for writable points. The same command dialog appears for BACnet and non-BACnet integrations, such as REST API thermostats. How each action maps on the device depends on the connector.BACnet points that accept commands have 16 priority levels (1 is highest, 16 is lowest). When every level is empty (null), the point uses a fallback / default value (Relinquish_Default in BACnet). That fallback is not a 17th BACnet priority. Some interfaces label it as level 17 for display only.Override and Set turn different knobs under the hood, even when the visible value looks the same.*Typical for most BACnet and Niagara deployments. Connectors and site standards can differ.Override, Auto, and Set borrow Niagara-style action names. Release is a Cloud BMS action that clears a Set.In Niagara-style control, Set keeps a non-null fallback so sequences and logic keep a reliable baseline. Use the priority array (including Override) for programmed automation and temporary exceptions.To make Set write to priority 16 instead of the fallback or default, enable Set in Slot16 (Niagara) on the point. Configure that option from device details, device templates, or points batch update.
Every write block has the following fields:
Field
A familiar name for easy reference and reporting.
Field
Opens a dialog to select the point you want to write to. The point must meet the block’s type requirements.
Field
The value to write, specified as a parameter or a static value.
Each write block produces a single Output that returns a true/false value indicating whether the point was written to successfully.

Write block types

Writes a string value to a point. Specify the value using a parameter or a static string.
String Write logic block showing trigger input, name field, field selector, write value input, and boolean output

String Write block with trigger, name, field, input, and output

Read blocks

Read blocks bring point data from connected devices into the workflow. Each read block provides two outputs: Status (the point’s connection status) and Value (the current reading from the point). Every read block has the following fields:
Field
A free-form input for identifying the block. Use a name that matches the point name for easy reference when troubleshooting or reviewing the workflow.
Toggle
Designates whether this block is the main reference point or a supporting point. Every workflow must have one and only one Main point. When an event is generated, the main point serves as the reference to other modules within Cloud BMS. All other read blocks are set to Secondary.
Field
Select inside the Field input to open a dialog where you can browse and choose the target point. Available points are scoped based on the entities defined in the workflow. If you do not see a point you need, verify that the selected entities contain that field.

Read block types

Reads the current string value from a point.
String Point logic block showing name field, Main or Secondary toggle, field selector, status output, and string value output

String Point block with name, Main or Secondary toggle, field selector, and status/value outputs

Read arrays

Use Read Array blocks when a device has two or more distinct fields with the same name. Within a device, it is possible to have two distinct points that share the same name, appended with an identifying number. The system identifies their array potential and allows you to select that type. For example, if a device has two compressor stages, determining whether a compressor is running requires checking both points. With a Read Array block, you bring in a single block instead of two separate read blocks. This simplifies the workflow and eliminates the need to cover all variations of multi-stage compressors within a single routine. Each Read Array block has the following fields:
Field
A familiar name for the set of points, used for reference and reporting.
Field
Select the set of points to read from. Points are derived from device entities and templating multiple points to the same field.
Each Read Array block outputs two lists: Status (one status per point in the array) and Value (one value per point in the array).
Reads a list of string values from multiple points mapped to the same field.
String Array logic block showing name field, field selector, status array output, and string value array output

String Array block with name, field selector, and array outputs for status and string values

Parameter blocks

Parameter blocks provide a way to customize values for projects that use the workflow, without editing the workflow itself. The values you set in parameter blocks become available when configuring a job that uses the workflow. Users can override defaults during project setup. Every parameter block has the following fields:
Field
A human-readable label for the parameter. Use a descriptive name that can be understood by anyone, such as “Pressure Min Threshold” or “Cooling - Delta.” Clear naming minimizes confusion when accessed later to troubleshoot or understand the intent.
Field
A string input that appears when the information icon is hovered over during parameter configuration. Use as many words as necessary to communicate the intent of the parameter, its expected range, and any constraints.
Field
The default value for the parameter. When you edit parameters during job setup, you alter this input to the algorithm. Users can override this value when setting up an FTT project.
The block outputs the value specified in the Value field (or the user’s override) for use by downstream blocks.

Parameter block types

Outputs a string value. Specify the string to output from this block. Values are available for customization during configuration.
String parameter logic block showing name field, hint field, value field, and output

String parameter block with name, hint, value, and output

Hint tooltip

The Hint text appears as an information bubble next to the value field when a user configures the parameter during project setup.
Parameter hint tooltip showing descriptive text for Pressure Min Threshold during project configuration

Parameter hint displayed as a tooltip during project configuration

Arithmetical blocks

Arithmetical blocks perform mathematical operations on number inputs. Use these blocks to calculate thresholds, derive values, and process sensor data. Multi-input blocks (Difference, Max, Mean, Min) accept two or more inputs. Click the + button on the block to add additional input fields. Each input accepts a linked number output from another block or a static value set directly in the field. The block outputs a single Result value. Single-input blocks (Absolute) accept one input and output a single Result value.
Calculates the difference between input values. Outputs the post-calculated value. Use the + button to add more operands.
Difference arithmetic block showing two numeric inputs, add operands button, and result output

Difference block with multiple inputs, add operands button, and result output

Array operation blocks

Array operation blocks process a list of values collected from Read Array blocks or Buffer blocks. Each block accepts a list input and outputs a single result value. Use these blocks to analyze trends and compute statistics.
Returns the difference between the minimum and maximum values in the list.
Delta array operation block showing list input and result output

Delta block with list input and result output

Example workflows

Difference between highest and lowest values over five minutes: Read Number > Buffer Time (5 min) > Array Sort (Ascending) > Array Delta 15-minute rolling average: Read Number > Buffer Time (15 min) > Array Mean

Conditional and switch blocks

Conditional and switch blocks direct the workflow’s execution path based on input data.

If block

The If block evaluates a true or false condition and routes data to one of two outputs. Link a block that outputs a boolean to the input. The block routes to Do when the condition evaluates to true and to Else when it evaluates to false.
If conditional block showing boolean input, Do output for true condition, and Else output for false condition

If block with boolean input and Do/Else outputs

Switch blocks

Switch blocks evaluate a boolean conditional input and return a value based on the result. The top return value outputs when the condition is true, and the bottom return value outputs when the condition is false. You can use block inputs or static values.
Outputs the corresponding string associated to the evaluated true or false condition.
String Switch block showing conditional boolean input, two string return values, and result output

String Switch block with conditional input, two return values, and string result output

Gate blocks

Gate blocks control the flow of data through the workflow by acting as barriers that open or close based on a trigger.
Prevents data from passing through until a data observation arrives at the trigger. The trigger accepts number, boolean, or string data. When an input is linked, an output of the same data type appears on the right.
Skip Until gate block showing trigger input and data input with matching output

Skip Until block with trigger and input/output

Logical and comparison blocks

Logical blocks

Logical blocks evaluate boolean inputs and produce a boolean result. Use the + button to add more operands.
Returns true only when all input values are true.
And logical block showing two boolean inputs, add operands button, and boolean result output

And block with multiple boolean inputs, add operands button, and result output

Not block

The Not block inverts a single boolean input value. True becomes false, and false becomes true.
Not logical block showing single boolean input and inverted boolean result output

Not block with single boolean input and inverted result output

Merge block

The Merge block combines multiple inputs of the same data type (number, boolean, or string) into a single output. As a data observation is received from any of the inputs, it is sent to the output regardless of order. Use the + button to add more inputs.
Merge block showing two inputs of the same type, add inputs button, and single output

Merge block with multiple inputs and single output of matching type

Comparison blocks

Comparison blocks evaluate two values and output a boolean result. You can use linked inputs or static values.
Outputs true if both inputs are evaluated as equal. Accepts number, boolean, or string operands (both must be the same type).
Equals comparison block showing left operand, right operand, and boolean result output

Equals block with left and right operands and boolean result output

Timing and buffering blocks

Timing blocks

  • Delay On: requires a condition to remain true for a specified duration before passing it forward
  • Delay Off: requires a condition to remain false for a specified duration before closing
  • Timer: measures how long a condition has been in a specific state

Audit and Debounce blocks

Waits for a specified amount of time and outputs the last value received from the input. Configure the wait time unit (seconds, minutes, or hours) and the count of time units to wait.
Audit timing block showing wait time dropdown, static number value, data input, and matching type output

Audit block with wait time configuration, count input, data input, and output

Buffer blocks

Buffer blocks collect values from an input into a list. The list is returned when the configured condition (time or count) is met.
Collects values from the input into a list that is returned after the specified amount of time. Configure the time unit (seconds, minutes, or hours) and the duration.
Buffer Time block showing time unit dropdown, static number value, data input, and list output

Buffer Time block with time settings, count input, data input, and list output

Testing blocks (FTT)

FTT-specific blocks manage the testing sequence lifecycle. These blocks handle sequence scoring, pass/fail evaluation, stabilization periods, and the release of equipment overrides at test completion.
Activates as soon as a data observation goes into its trigger. Outputs a true/false value indicating whether the sequence was successful. Configure the sequence name and count.
Sequence testing block showing trigger, name field, sequence count, boolean input, and success output

Sequence block with trigger, name, sequence count, input, and pass/fail output

Every FTT workflow must end with a Release block. When the Release block executes, the test ends and all commands issued to the equipment during the test are released.

Time control parameters

Most workflows use three standard time control parameters applied to each sequence:

Next steps

Workflows

Create, test, and manage workflows using the logic builder and debugger.

Workflow creator guide

Follow the end-to-end process for designing and building custom workflows.

What is Functional Testing?

Review how library workflows decide pass or fail before you edit blocks.
Last modified on August 18, 2026