> ## Documentation Index
> Fetch the complete documentation index at: https://documentation.kodelabs.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Workflow logic blocks

> Reference guide for all logic block types available in the FTT workflow builder, including read, write, parameter, arithmetic, conditional, timing, and testing blocks.

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?](/products/ftt/overview). For end-to-end custom authoring, see the [Workflow creator guide](/products/ftt/workflow-creator-guide). Most sites start with the [workflow library](/products/ftt/fcu-workflows) 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.

<Info>
  ### 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.

  | Action     | What it writes\*     | Description                                                                                 |
  | ---------- | -------------------- | ------------------------------------------------------------------------------------------- |
  | `Override` | Priority 8\*         | Temporary exception in the priority array. Takes precedence over lower-priority automation. |
  | `Set`      | Fallback / default\* | Changes the fallback or default value.                                                      |
  | `Auto`     | —                    | Clears an `Override`                                                                        |
  | `Release`  | —                    | Clears a `Set`                                                                              |

  \*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](/products/kode-os/devices/devices#view-and-edit-points), [device templates](/products/kode-os/devices/device-templates), or [points batch update](/products/kode-os/points/points-batch-update).
</Info>

Every write block has the following fields:

<ParamField path="Name" type="Field">
  A familiar name for easy reference and reporting.
</ParamField>

<ParamField path="Field" type="Field">
  Opens a dialog to select the point you want to write to. The point must meet the block's type requirements.
</ParamField>

<ParamField path="Input" type="Field">
  The value to write, specified as a parameter or a static value.
</ParamField>

Each write block produces a single **Output** that returns a true/false value indicating whether the point was written to successfully.

### Write block types

<Tabs>
  <Tab title="String Write">
    Writes a string value to a point. Specify the value using a parameter or a static string.

    <Frame caption="String Write block with trigger, name, field, input, and output">
      <img src="https://mintcdn.com/kodelabs/1vjgtnWf-CUbC2z9/images/kode-os/ftt/ftt-string-write-block.png?fit=max&auto=format&n=1vjgtnWf-CUbC2z9&q=85&s=214b594ac8a7344df879164e957e4903" alt="String Write logic block showing trigger input, name field, field selector, write value input, and boolean output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-string-write-block.png" />
    </Frame>
  </Tab>

  <Tab title="Number Write">
    Writes a numeric value to a point. Specify the value using a parameter or a static number.

    <Frame caption="Number Write block with trigger, name, field, input, and output">
      <img src="https://mintcdn.com/kodelabs/1vjgtnWf-CUbC2z9/images/kode-os/ftt/ftt-number-write-block.png?fit=max&auto=format&n=1vjgtnWf-CUbC2z9&q=85&s=5bd5ba72d04ca1d77ed092ec4f6b1aed" alt="Number Write logic block showing trigger input, name field, field selector, numeric input, and boolean output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-number-write-block.png" />
    </Frame>
  </Tab>

  <Tab title="Boolean Write">
    Writes a true or false value to a point. Specify the value using a parameter or a static "true" or "false".

    <Frame caption="Boolean Write block with trigger, name, field, input, and output">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-boolean-write-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=67753d136e83da6aa05bc1bce83d2b45" alt="Boolean Write logic block showing trigger input, name field, field selector, boolean input, and boolean output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-boolean-write-block.png" />
    </Frame>
  </Tab>

  <Tab title="Enum Write">
    Writes a list of strings to a point. Specify the value using a parameter or a static list of strings.

    <Frame caption="Enum Write block with trigger, name, field, input, and output">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-enum-write-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=9dac96b6d13448f1967dc1dc2d30323c" alt="Enum Write logic block showing trigger input, name field, field selector, enum list input, and boolean output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-enum-write-block.png" />
    </Frame>
  </Tab>
</Tabs>

## 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:

<ParamField path="Name" type="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.
</ParamField>

<ParamField path="Main / Secondary" type="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`.
</ParamField>

<ParamField path="Field" type="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.
</ParamField>

### Read block types

<Tabs>
  <Tab title="String Point">
    Reads the current string value from a point.

    <Frame caption="String Point block with name, Main or Secondary toggle, field selector, and status/value outputs">
      <img src="https://mintcdn.com/kodelabs/1vjgtnWf-CUbC2z9/images/kode-os/ftt/ftt-string-point-block.png?fit=max&auto=format&n=1vjgtnWf-CUbC2z9&q=85&s=a3f19b368dee0f5eefb78a2c5c71c586" alt="String Point logic block showing name field, Main or Secondary toggle, field selector, status output, and string value output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-string-point-block.png" />
    </Frame>
  </Tab>

  <Tab title="Number Point">
    Reads the current numeric value from a point.

    <Frame caption="Number Point block with name, Main or Secondary toggle, field selector, and status/value outputs">
      <img src="https://mintcdn.com/kodelabs/1vjgtnWf-CUbC2z9/images/kode-os/ftt/ftt-number-point-block.png?fit=max&auto=format&n=1vjgtnWf-CUbC2z9&q=85&s=f40a9a980fed33e49c9a4861902193aa" alt="Number Point logic block showing name field, Main or Secondary toggle, field selector, status output, and number value output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-number-point-block.png" />
    </Frame>
  </Tab>

  <Tab title="Boolean Point">
    Reads the current boolean value from a point.

    <Frame caption="Boolean Point block with name, Main or Secondary toggle, field selector, and status/value outputs">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-boolean-point-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=1510d8962dbd0b3adc3ce5421d6c4fdd" alt="Boolean Point logic block showing name field, Main or Secondary toggle, field selector, status output, and boolean value output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-boolean-point-block.png" />
    </Frame>
  </Tab>

  <Tab title="Enum Point">
    Reads the current enum-mapped values from a point. The Field selector derives from device entities and enum mapping.

    <Frame caption="Enum Point block with name, Main or Secondary toggle, field selector, and status/value outputs">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-enum-point-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=60c74e8c2adad2c21c17ac84d886ed6b" alt="Enum Point logic block showing name field, Main or Secondary toggle, field selector, status output, and enum value output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-enum-point-block.png" />
    </Frame>
  </Tab>
</Tabs>

### 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:

<ParamField path="Name" type="Field">
  A familiar name for the set of points, used for reference and reporting.
</ParamField>

<ParamField path="Field" type="Field">
  Select the set of points to read from. Points are derived from device entities and templating multiple points to the same field.
</ParamField>

Each Read Array block outputs two lists: **Status** (one status per point in the array) and **Value** (one value per point in the array).

<Tabs>
  <Tab title="String Array">
    Reads a list of string values from multiple points mapped to the same field.

    <Frame caption="String Array block with name, field selector, and array outputs for status and string values">
      <img src="https://mintcdn.com/kodelabs/1vjgtnWf-CUbC2z9/images/kode-os/ftt/ftt-string-array-block.png?fit=max&auto=format&n=1vjgtnWf-CUbC2z9&q=85&s=2204f64d579c636fac212d735fc1b131" alt="String Array logic block showing name field, field selector, status array output, and string value array output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-string-array-block.png" />
    </Frame>
  </Tab>

  <Tab title="Number Array">
    Reads a list of numeric values from multiple points mapped to the same field.

    <Frame caption="Number Array block with name, field selector, and array outputs for status and number values">
      <img src="https://mintcdn.com/kodelabs/1vjgtnWf-CUbC2z9/images/kode-os/ftt/ftt-number-array-block.png?fit=max&auto=format&n=1vjgtnWf-CUbC2z9&q=85&s=f222d2ebb60e3fbfe3e2a328d3dca0d8" alt="Number Array logic block showing name field, field selector, status array output, and number value array output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-number-array-block.png" />
    </Frame>
  </Tab>

  <Tab title="Boolean Array">
    Reads a list of boolean values from multiple points mapped to the same field.

    <Frame caption="Boolean Array block with name, field selector, and array outputs for status and boolean values">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-boolean-array-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=400efd95c4590059a7e87020932018b3" alt="Boolean Array logic block showing name field, field selector, status array output, and boolean value array output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-boolean-array-block.png" />
    </Frame>
  </Tab>

  <Tab title="Enum Array">
    Reads a list of enum values from multiple points mapped to the same field.

    <Frame caption="Enum Array block with name, field selector, and array outputs for status and enum values">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-enum-array-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=291ff746ffd7ce4271dcded3ed586c6e" alt="Enum Array logic block showing name field, field selector, status array output, and enum value array output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-enum-array-block.png" />
    </Frame>
  </Tab>
</Tabs>

## 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:

<ParamField path="Name" type="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.
</ParamField>

<ParamField path="Hint" type="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.
</ParamField>

<ParamField path="Value" type="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.
</ParamField>

The block outputs the value specified in the `Value` field (or the user's override) for use by downstream blocks.

### Parameter block types

<Tabs>
  <Tab title="String">
    Outputs a string value. Specify the string to output from this block. Values are available for customization during configuration.

    <Frame caption="String parameter block with name, hint, value, and output">
      <img src="https://mintcdn.com/kodelabs/1vjgtnWf-CUbC2z9/images/kode-os/ftt/ftt-string-parameter-block.png?fit=max&auto=format&n=1vjgtnWf-CUbC2z9&q=85&s=be0b49006a540dc7d24d05461bd6e03a" alt="String parameter logic block showing name field, hint field, value field, and output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-string-parameter-block.png" />
    </Frame>
  </Tab>

  <Tab title="Number">
    Outputs a number value. Specify the number to output from this block. Values are available for customization during configuration.

    <Frame caption="Number parameter block with name, hint, value, and output">
      <img src="https://mintcdn.com/kodelabs/1vjgtnWf-CUbC2z9/images/kode-os/ftt/ftt-number-parameter-block.png?fit=max&auto=format&n=1vjgtnWf-CUbC2z9&q=85&s=5a34752d1ff5516577cdca67607223ae" alt="Number parameter logic block showing name field, hint field, numeric value field, and output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-number-parameter-block.png" />
    </Frame>
  </Tab>

  <Tab title="Boolean">
    Outputs a boolean value. Specify the boolean to output from this block. Values are available for customization during configuration.

    <Frame caption="Boolean parameter block with name, hint, value, and output">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-boolean-parameter-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=35ac995c6ba5c9a3fd3055e4d392444b" alt="Boolean parameter logic block showing name field, hint field, boolean value field, and output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-boolean-parameter-block.png" />
    </Frame>
  </Tab>
</Tabs>

### Hint tooltip

The `Hint` text appears as an information bubble next to the value field when a user configures the parameter during project setup.

<Frame caption="Parameter hint displayed as a tooltip during project configuration">
  <img src="https://mintcdn.com/kodelabs/1vjgtnWf-CUbC2z9/images/kode-os/ftt/ftt-parameter-hint-tooltip.png?fit=max&auto=format&n=1vjgtnWf-CUbC2z9&q=85&s=e7f46b6f517178af08dc6ac75f02e525" alt="Parameter hint tooltip showing descriptive text for Pressure Min Threshold during project configuration" width="884" height="290" data-path="images/kode-os/ftt/ftt-parameter-hint-tooltip.png" />
</Frame>

## 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.

<Tabs>
  <Tab title="Difference">
    Calculates the difference between input values. Outputs the post-calculated value. Use the **+** button to add more operands.

    <Frame caption="Difference block with multiple inputs, add operands button, and result output">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-difference-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=4d3f734782499dab60869e422457acea" alt="Difference arithmetic block showing two numeric inputs, add operands button, and result output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-difference-block.png" />
    </Frame>
  </Tab>

  <Tab title="Max">
    Returns the largest value from all inputs. Use the **+** button to add more inputs.

    <Frame caption="Max block with multiple inputs, add inputs button, and result output">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-max-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=b11f5d049bb65da1280139b5f8983320" alt="Max arithmetic block showing two numeric inputs, add inputs button, and result output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-max-block.png" />
    </Frame>
  </Tab>

  <Tab title="Mean">
    Returns the average of all input values. Use the **+** button to add more inputs.

    <Frame caption="Mean block with multiple inputs, add inputs button, and result output">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-mean-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=b93fe94e789e8ec821aca953d4dadb77" alt="Mean arithmetic block showing two numeric inputs, add inputs button, and result output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-mean-block.png" />
    </Frame>
  </Tab>

  <Tab title="Min">
    Returns the smallest value from all inputs. Use the **+** button to add more inputs.

    <Frame caption="Min block with multiple inputs, add inputs button, and result output">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-min-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=cc8b7e720f2fcd6cb80ae5b0cb349848" alt="Min arithmetic block showing two numeric inputs, add inputs button, and result output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-min-block.png" />
    </Frame>
  </Tab>

  <Tab title="Absolute">
    Returns the non-negative value of the input. Accepts a single number input or a static value.

    <Frame caption="Absolute block with single input and result output">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-absolute-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=6d04f622ef73c835ae6778ebe6937468" alt="Absolute arithmetic block showing single numeric input and result output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-absolute-block.png" />
    </Frame>
  </Tab>

  <Tab title="Sum">
    Adds all input values together. Use the **+** button to add more operands.

    <Frame caption="Sum block with multiple inputs, add operands button, and result output">
      <img src="https://mintcdn.com/kodelabs/1vjgtnWf-CUbC2z9/images/kode-os/ftt/ftt-sum-block.png?fit=max&auto=format&n=1vjgtnWf-CUbC2z9&q=85&s=b51ffc140f4612e962afd7ca617acaa3" alt="Sum arithmetic block showing two numeric inputs, add operands button, and result output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-sum-block.png" />
    </Frame>
  </Tab>

  <Tab title="Product">
    Multiplies all input values together. Use the **+** button to add more operands.

    <Frame caption="Product block with multiple inputs, add operands button, and result output">
      <img src="https://mintcdn.com/kodelabs/1vjgtnWf-CUbC2z9/images/kode-os/ftt/ftt-product-block.png?fit=max&auto=format&n=1vjgtnWf-CUbC2z9&q=85&s=1590614df9554512c6fa010aa7273087" alt="Product arithmetic block showing two numeric inputs, add operands button, and result output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-product-block.png" />
    </Frame>
  </Tab>

  <Tab title="Quotient">
    Divides the first input by the second. Use the **+** button to add more operands for chained division.

    <Frame caption="Quotient block with multiple inputs, add operands button, and result output">
      <img src="https://mintcdn.com/kodelabs/1vjgtnWf-CUbC2z9/images/kode-os/ftt/ftt-quotient-block.png?fit=max&auto=format&n=1vjgtnWf-CUbC2z9&q=85&s=6ed3dd86a6241865fdf78bbea132392d" alt="Quotient arithmetic block showing two numeric inputs, add operands button, and result output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-quotient-block.png" />
    </Frame>
  </Tab>

  <Tab title="Modulo">
    Returns the remainder from dividing the first input by the second.

    <Frame caption="Modulo block with two inputs and result output">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-modulo-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=d9ff26452a329d09561e49ded230bb72" alt="Modulo arithmetic block showing two numeric inputs and result output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-modulo-block.png" />
    </Frame>
  </Tab>
</Tabs>

## 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.

<Tabs>
  <Tab title="Delta">
    Returns the difference between the minimum and maximum values in the list.

    <Frame caption="Delta block with list input and result output">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-delta-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=f7124df01d2e85578812afb5908eb318" alt="Delta array operation block showing list input and result output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-delta-block.png" />
    </Frame>
  </Tab>

  <Tab title="Max Array">
    Returns the largest number in the list.

    <Frame caption="Max Array block with list input and result output">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-max-array-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=62f97a3bd19fb847da641b2fe872c1d5" alt="Max Array operation block showing list input and result output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-max-array-block.png" />
    </Frame>
  </Tab>

  <Tab title="Length">
    Returns the count of items in the provided list. Accepts lists of numbers, booleans, or strings.

    <Frame caption="Length block with list input and result output">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-length-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=a2d2cc7d43074a15fad556e04d603565" alt="Length array operation block showing list input and result output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-length-block.png" />
    </Frame>
  </Tab>

  <Tab title="Mean Array">
    Returns the mean of the numbers in the list. Choose between a weighted mean or a simple average.

    <Frame caption="Mean Array block with weighted/simple toggle, list input, and result output">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-mean-array-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=573a65871ae917a0058bd06aa6452579" alt="Mean Array operation block showing weighted toggle, list input, and result output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-mean-array-block.png" />
    </Frame>
  </Tab>

  <Tab title="Min Array">
    Returns the smallest number in the list.

    <Frame caption="Min Array block with list input and result output">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-min-array-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=c2ea7d52ace99afab9940a981945815c" alt="Min Array operation block showing list input and result output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-min-array-block.png" />
    </Frame>
  </Tab>

  <Tab title="Sort Array">
    Returns the input list sorted in ascending or descending order.

    <Frame caption="Sort Array block with ascending/descending toggle, list input, and sorted list output">
      <img src="https://mintcdn.com/kodelabs/1vjgtnWf-CUbC2z9/images/kode-os/ftt/ftt-sort-array-block.png?fit=max&auto=format&n=1vjgtnWf-CUbC2z9&q=85&s=d3cfcbad678249bf23f76086e1284781" alt="Sort Array operation block showing sort order toggle, list input, and sorted list output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-sort-array-block.png" />
    </Frame>
  </Tab>

  <Tab title="Std Deviation">
    Returns the standard deviation of the numbers in the list. Choose between a weighted or simple standard deviation.

    <Frame caption="Std Deviation block with weighted/simple toggle, list input, and result output">
      <img src="https://mintcdn.com/kodelabs/1vjgtnWf-CUbC2z9/images/kode-os/ftt/ftt-std-deviation-block.png?fit=max&auto=format&n=1vjgtnWf-CUbC2z9&q=85&s=83d198074683c633f1f63bd550372ed3" alt="Std Deviation operation block showing weighted toggle, list input, and result output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-std-deviation-block.png" />
    </Frame>
  </Tab>

  <Tab title="Sum Array">
    Returns the sum of all numbers in the list.

    <Frame caption="Sum Array block with list input and result output">
      <img src="https://mintcdn.com/kodelabs/1vjgtnWf-CUbC2z9/images/kode-os/ftt/ftt-sum-array-block.png?fit=max&auto=format&n=1vjgtnWf-CUbC2z9&q=85&s=d889c5350f1dc8bc6d87c68d60a9c3d3" alt="Sum Array operation block showing list input and result output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-sum-array-block.png" />
    </Frame>
  </Tab>

  <Tab title="Variance">
    Returns the variance of the numbers in the list. Choose between a weighted or simple variance.

    <Frame caption="Variance block with weighted/simple toggle, list input, and result output">
      <img src="https://mintcdn.com/kodelabs/1vjgtnWf-CUbC2z9/images/kode-os/ftt/ftt-variance-block.png?fit=max&auto=format&n=1vjgtnWf-CUbC2z9&q=85&s=1e5a94cff507cbe203ebae416afd711e" alt="Variance operation block showing weighted toggle, list input, and result output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-variance-block.png" />
    </Frame>
  </Tab>
</Tabs>

### 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.

<Frame caption="If block with boolean input and Do/Else outputs">
  <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-if-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=d53538315f09bcd8950ec1f5d56d22b4" alt="If conditional block showing boolean input, Do output for true condition, and Else output for false condition" width="1024" height="478" data-path="images/kode-os/ftt/ftt-if-block.png" />
</Frame>

### 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.

<Tabs>
  <Tab title="String Switch">
    Outputs the corresponding string associated to the evaluated true or false condition.

    <Frame caption="String Switch block with conditional input, two return values, and string result output">
      <img src="https://mintcdn.com/kodelabs/1vjgtnWf-CUbC2z9/images/kode-os/ftt/ftt-string-switch-block.png?fit=max&auto=format&n=1vjgtnWf-CUbC2z9&q=85&s=6493116ca2f6a7d67654e78a23f2170e" alt="String Switch block showing conditional boolean input, two string return values, and result output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-string-switch-block.png" />
    </Frame>
  </Tab>

  <Tab title="Numeric Switch">
    Outputs the corresponding number associated to the evaluated true or false condition.

    <Frame caption="Numeric Switch block with conditional input, two return values, and number result output">
      <img src="https://mintcdn.com/kodelabs/1vjgtnWf-CUbC2z9/images/kode-os/ftt/ftt-numeric-switch-block.png?fit=max&auto=format&n=1vjgtnWf-CUbC2z9&q=85&s=c2c41e729102667fc1f0da65e8d75f93" alt="Numeric Switch block showing conditional boolean input, two number return values, and result output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-numeric-switch-block.png" />
    </Frame>
  </Tab>

  <Tab title="Boolean Switch">
    Outputs the boolean associated to the evaluated true or false condition.

    <Frame caption="Boolean Switch block with conditional input, two return values, and boolean result output">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-boolean-switch-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=0a45d13c8cfddce18aea8b69f0e34d55" alt="Boolean Switch block showing conditional boolean input, two boolean return values, and result output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-boolean-switch-block.png" />
    </Frame>
  </Tab>
</Tabs>

### Gate blocks

Gate blocks control the flow of data through the workflow by acting as barriers that open or close based on a trigger.

<Tabs>
  <Tab title="Skip Until">
    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.

    <Frame caption="Skip Until block with trigger and input/output">
      <img src="https://mintcdn.com/kodelabs/1vjgtnWf-CUbC2z9/images/kode-os/ftt/ftt-skip-until-block.png?fit=max&auto=format&n=1vjgtnWf-CUbC2z9&q=85&s=bd58da22cc5ebd82e1d58d6d0cf52fb1" alt="Skip Until gate block showing trigger input and data input with matching output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-skip-until-block.png" />
    </Frame>
  </Tab>

  <Tab title="Take Until">
    Passes data through until a data observation arrives via the trigger, then stops. The trigger accepts number, boolean, or string data. When an input is linked, an output of the same data type appears on the right.

    <Frame caption="Take Until block with trigger and input/output">
      <img src="https://mintcdn.com/kodelabs/1vjgtnWf-CUbC2z9/images/kode-os/ftt/ftt-take-until-block.png?fit=max&auto=format&n=1vjgtnWf-CUbC2z9&q=85&s=1914c7a2a9e1051c69b57d293e930f79" alt="Take Until gate block showing trigger input and data input with matching output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-take-until-block.png" />
    </Frame>
  </Tab>
</Tabs>

## Logical and comparison blocks

### Logical blocks

Logical blocks evaluate boolean inputs and produce a boolean result. Use the **+** button to add more operands.

<Tabs>
  <Tab title="And">
    Returns true only when all input values are true.

    <Frame caption="And block with multiple boolean inputs, add operands button, and result output">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-and-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=54644b2fada281d1c3e7933015d86694" alt="And logical block showing two boolean inputs, add operands button, and boolean result output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-and-block.png" />
    </Frame>
  </Tab>

  <Tab title="Or">
    Returns true if any input value is true.

    <Frame caption="Or block with multiple boolean inputs, add operands button, and result output">
      <img src="https://mintcdn.com/kodelabs/1vjgtnWf-CUbC2z9/images/kode-os/ftt/ftt-or-block.png?fit=max&auto=format&n=1vjgtnWf-CUbC2z9&q=85&s=763ee7fb9c3b333b998577b6ad5c7362" alt="Or logical block showing two boolean inputs, add operands button, and boolean result output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-or-block.png" />
    </Frame>
  </Tab>
</Tabs>

### Not block

The Not block inverts a single boolean input value. True becomes false, and false becomes true.

<Frame caption="Not block with single boolean input and inverted result output">
  <img src="https://mintcdn.com/kodelabs/1vjgtnWf-CUbC2z9/images/kode-os/ftt/ftt-not-block.png?fit=max&auto=format&n=1vjgtnWf-CUbC2z9&q=85&s=453e9e1ac6baef678372c0a43f8a86ec" alt="Not logical block showing single boolean input and inverted boolean result output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-not-block.png" />
</Frame>

### 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.

<Frame caption="Merge block with multiple inputs and single output of matching type">
  <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-merge-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=427fecc43ec73de860fa3d2a796b718e" alt="Merge block showing two inputs of the same type, add inputs button, and single output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-merge-block.png" />
</Frame>

### Comparison blocks

Comparison blocks evaluate two values and output a boolean result. You can use linked inputs or static values.

<Tabs>
  <Tab title="Equals">
    Outputs true if both inputs are evaluated as equal. Accepts number, boolean, or string operands (both must be the same type).

    <Frame caption="Equals block with left and right operands and boolean result output">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-equals-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=69715230c0f7a9eae8373ce62d054fa5" alt="Equals comparison block showing left operand, right operand, and boolean result output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-equals-block.png" />
    </Frame>
  </Tab>

  <Tab title="Greater Than">
    Outputs true if the left operand is greater than the right operand.

    <Frame caption="Greater Than block with two number inputs and boolean result output">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-greater-than-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=7d124031a48601a16acaae52a60f1005" alt="Greater Than comparison block showing two number inputs and boolean result output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-greater-than-block.png" />
    </Frame>
  </Tab>

  <Tab title="Less Than">
    Outputs true if the left operand is less than the right operand.

    <Frame caption="Less Than block with two number inputs and boolean result output">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-less-than-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=d200d587b68c694f76a207489933d6dd" alt="Less Than comparison block showing two number inputs and boolean result output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-less-than-block.png" />
    </Frame>
  </Tab>

  <Tab title="All">
    Outputs true if all items in the input list match the specified value. Link a list containing items of the same type as the value.

    <Frame caption="All block with list input, value input, and boolean result output">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-all-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=5457c133324a0f3d5e4accd4ac718c9c" alt="All comparison block showing list input, value input, and boolean result output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-all-block.png" />
    </Frame>
  </Tab>

  <Tab title="In">
    Outputs true if the data observation received by the value input is found as an item in the input list.

    <Frame caption="In block with list input, value input, and boolean result output">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-in-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=1d2723565edc2259a7b344f1f971a597" alt="In comparison block showing list input, value input, and boolean result output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-in-block.png" />
    </Frame>
  </Tab>
</Tabs>

## 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

<Tabs>
  <Tab title="Audit">
    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.

    <Frame caption="Audit block with wait time configuration, count input, data input, and output">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-audit-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=899acd5d33ab62725827b4bc80d2cab0" alt="Audit timing block showing wait time dropdown, static number value, data input, and matching type output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-audit-block.png" />
    </Frame>
  </Tab>

  <Tab title="Debounce">
    Waits for a specified amount of time and outputs a value only if that value has been unchanged during that period. Configure the wait time unit (seconds, minutes, or hours) and the count of time units to wait.

    <Frame caption="Debounce block with wait time configuration, count input, data input, and output">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-debounce-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=9ebcfaecaf74b28e16b3b6ec79ddb739" alt="Debounce timing block showing wait time dropdown, static number value, data input, and matching type output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-debounce-block.png" />
    </Frame>
  </Tab>
</Tabs>

### 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.

<Tabs>
  <Tab title="Buffer Time">
    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.

    <Frame caption="Buffer Time block with time settings, count input, data input, and list output">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-buffer-time-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=96646a524e3393c45cdbe7bd1027a5d0" alt="Buffer Time block showing time unit dropdown, static number value, data input, and list output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-buffer-time-block.png" />
    </Frame>
  </Tab>

  <Tab title="Buffer Count">
    Collects values from the input into a list that is returned when the count is satisfied. Specify the number of values to collect.

    <Frame caption="Buffer Count block with count setting, data input, and list output">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-buffer-count-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=b053b5e00a5cde6567bae2112f9a4a0f" alt="Buffer Count block showing count setting, data input, and list output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-buffer-count-block.png" />
    </Frame>
  </Tab>
</Tabs>

## 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.

<Tabs>
  <Tab title="Sequence">
    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.

    <Frame caption="Sequence block with trigger, name, sequence count, input, and pass/fail output">
      <img src="https://mintcdn.com/kodelabs/1vjgtnWf-CUbC2z9/images/kode-os/ftt/ftt-sequence-block.png?fit=max&auto=format&n=1vjgtnWf-CUbC2z9&q=85&s=e2ea2e34c0c6219d2bf81fee9c2f364e" alt="Sequence testing block showing trigger, name field, sequence count, boolean input, and success output" width="1024" height="478" data-path="images/kode-os/ftt/ftt-sequence-block.png" />
    </Frame>
  </Tab>

  <Tab title="Logger">
    Sends a string value to the workflow logger for debugging and reporting. Link a string output or enter a static string value.

    <Frame caption="Logger block with string input">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-logger-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=33ce18aff9ae1a080ad34005cc68ac8d" alt="Logger testing block showing string input and static value option" width="1024" height="478" data-path="images/kode-os/ftt/ftt-logger-block.png" />
    </Frame>
  </Tab>

  <Tab title="Archive">
    Initiates when a data observation goes into its trigger. The trigger accepts number, boolean, or string data. Use this block to archive data at specific points in the test sequence.

    <Frame caption="Archive block with trigger input">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-archive-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=b80ec17797dab8dad176e0682b564957" alt="Archive testing block showing trigger input accepting number, boolean, or string data" width="1024" height="478" data-path="images/kode-os/ftt/ftt-archive-block.png" />
    </Frame>
  </Tab>

  <Tab title="Interrupt">
    Initiates when a data observation goes into its trigger. The trigger accepts number, boolean, or string data. Use this block to interrupt the test sequence.

    <Frame caption="Interrupt block with trigger input">
      <img src="https://mintcdn.com/kodelabs/i9tCc_I6OZNqDXAw/images/kode-os/ftt/ftt-interrupt-block.png?fit=max&auto=format&n=i9tCc_I6OZNqDXAw&q=85&s=9a4a9f77e2ae451fe57ee4ff9c7bb6f7" alt="Interrupt testing block showing trigger input accepting number, boolean, or string data" width="1024" height="478" data-path="images/kode-os/ftt/ftt-interrupt-block.png" />
    </Frame>
  </Tab>

  <Tab title="Release">
    Initiates when a data observation goes into its trigger. The trigger accepts number, boolean, or string data. When the Release block executes, the test ends and all commands issued to the equipment during the test are released.

    <Frame caption="Release block with trigger input">
      <img src="https://mintcdn.com/kodelabs/1vjgtnWf-CUbC2z9/images/kode-os/ftt/ftt-release-block.png?fit=max&auto=format&n=1vjgtnWf-CUbC2z9&q=85&s=86775c0112d3d701351d3161f67d2185" alt="Release testing block showing trigger input accepting number, boolean, or string data" width="1024" height="478" data-path="images/kode-os/ftt/ftt-release-block.png" />
    </Frame>
  </Tab>
</Tabs>

<Warning>
  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.
</Warning>

## Time control parameters

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

| Parameter               | Description                                                                               | Units   |
| ----------------------- | ----------------------------------------------------------------------------------------- | ------- |
| `Min Sequence Duration` | Minimum time the equipment has to respond to a command before evaluation begins           | Seconds |
| `Max Sequence Duration` | Maximum time allowed for the equipment to meet success criteria before the sequence fails | Seconds |
| `Stabilization Time`    | Buffer time between sequences to allow the equipment to return to a neutral state         | Seconds |

## Next steps

<CardGroup cols={2}>
  <Card title="Workflows" icon="workflow" href="/products/ftt/workflows" arrow={true}>
    Create, test, and manage workflows using the logic builder and debugger.
  </Card>

  <Card title="Workflow creator guide" icon="drafting-compass" href="/products/ftt/workflow-creator-guide" arrow={true}>
    Follow the end-to-end process for designing and building custom workflows.
  </Card>

  <Card title="What is Functional Testing?" icon="rocket" href="/products/ftt/overview" arrow={true}>
    Review how library workflows decide pass or fail before you edit blocks.
  </Card>
</CardGroup>
