Flow Cards Reference

Complete guide to all available flow cards

Quick Navigation

WHEN Cards (Triggers)

Trigger

Composite value changed

Triggers whenever a Composite Device exposes a different numeric, boolean, or text value after its startup baseline has been established.

Tokens:

  • value - Current value as text
  • previous_value - Previous value as text
  • value_type - number, boolean, or string
  • device_name - Composite Device name

Composite value changed by more than [threshold] [type]

For numeric Composite Devices. Compares consecutive exposed values and fires when the absolute fixed or percentage change is strictly greater than the configured threshold.

Parameters:

  • threshold - Non-negative number
  • threshold type - Fixed units or percent

Tokens:

  • value / previous_value
  • change - Signed difference
  • absolute_change - Absolute difference
  • percentage_change - Absolute percentage difference

A non-zero value following zero counts as a 100% change. Smaller consecutive changes are not accumulated.

Formula [formula] changed

Triggers on every transition between TRUE and FALSE for the selected Logic Unit formula.

Parameters:

  • formula - Select which formula to monitor

Tokens:

  • result - New result
  • previous_result - Previous result
  • formula_name / device_name

Formula [formula] changed to [result]

Triggers only when the selected Logic Unit formula changes to the selected TRUE or FALSE result.

Parameters:

  • formula - Select which formula to monitor
  • result - TRUE or FALSE

Tokens:

  • result - New result
  • previous_result - Previous result

Example:

WHEN Formula [security_alert] changed to [TRUE]

THEN Send notification "Security alert triggered!"

The first complete evaluation establishes the formula baseline. These cards fire on later TRUE↔FALSE transitions. Use the Logic Unit's Formula result alarm when a Flow must also react when the first complete result becomes TRUE.

State changed (Logic Device only)

Triggers on ANY state change (TRUE→FALSE or FALSE→TRUE) with a token containing the new state.

Parameters:

  • None - Triggers on any change

Tokens:

  • state - The new state (true/false)
  • device_name - Name of the Logic Device

Example:

WHEN [Motion Light] State changed

THEN Send notification "Motion Light is now {{state}}"

✓ Logic Device exclusive feature - responds to both TRUE and FALSE changes

Formula [formula] timed out

Triggers when a formula's evaluation times out (inputs didn't arrive within timeout period).

Parameters:

  • formula - Select which formula to monitor (dropdown)

Example:

WHEN Formula [door_sequence] timed out

THEN Send notification "Door sequence incomplete - check sensors"

⚠️ Only triggers if timeout is configured in formula settings (timeout > 0)

[Person] has been away for [minutes]

Starts counting when the selected Homey person becomes Away. It fires only if the same person remains away for the full delay; returning home cancels the pending trigger.

Presence+ setup, examples and limitations →

Parameters:

  • person - Enabled Homey user with an available presence state
  • minutes - Whole minutes from 1 to 10,080 (seven days)

Output tokens:

  • person_name - Name of the person
  • away_minutes - Actual continuous absence in minutes
  • away_since - ISO timestamp for the start of the absence

Everyone has been away for [minutes]

Starts counting when the last present Homey person becomes Away. It fires only if nobody returns for the full delay; any return cancels the pending trigger.

Parameters:

  • minutes - Whole minutes from 1 to 10,080 (seven days)

Output tokens:

  • away_minutes - Actual continuous absence in minutes
  • away_since - ISO timestamp for when the last person left
  • people_count - Number of people included
  • last_person_name - Name of the last person to leave

Only enabled Homey users whose presence is available are included. Countdown state and fired thresholds are persisted across app restarts.

Wait for gate [gate_name] finished

Fires when a background wait started with Start waiting for Conditional Gate GO ends. Not fired when the wait is stopped or restarted. No device needed.

Parameters:

  • gate_name - Gate to listen for (autocomplete, exact match)

Output tokens:

  • opened - Boolean: true if the gate became GO
  • result - Text: GO or TIMEOUT
  • waited_seconds - Number: how long the wait ran

Example:

WHEN Conditional Gate wait finished "Razor"

THEN Turn off Razor

Capability wait [waiter_id] finished

Fires when a background wait started with Start waiting until device capability becomes value ends for the selected Waiter ID. Not fired when the wait is stopped or restarted.

Parameters:

  • waiter_id - Waiter ID to listen for (autocomplete or custom, exact match)

Output tokens:

  • matched - Boolean: true if the target value was reached
  • result - Text: MATCHED or TIMEOUT
  • value - Text: last known capability value (empty if unknown)
  • waited_seconds - Number: how long the wait ran

Example:

WHEN Capability wait finished "front_door"

AND "Value matched" tag is No

THEN Notify "Front door still open!"

AND Cards (Conditions)

Condition

Formula [formula] result is [state]

Checks if a formula's current result matches the specified state.

Parameters:

  • formula - Select which formula to check (dropdown)
  • state - TRUE or FALSE (dropdown)

Example:

WHEN Motion detected

AND Formula [nighttime] result is [TRUE]

THEN Turn on lights

Device is turned [on/off]

Checks if the Logic Device/Unit is enabled or disabled.

Parameters:

  • state - On or Off (dropdown)

Example:

WHEN Time is 23:00

AND [Security Logic] is turned [ON]

THEN Arm security system

Has error / Has any error

Checks if a specific formula or the entire device has any errors.

Variants:

  • Formula [formula] has error - Check specific formula
  • Has any error - Check if device has any errors

Example:

WHEN Every hour

AND [Security Logic] has any error

THEN Send notification "Check security logic configuration"

Math Compare: [left] [operator] [operand] is [comparison] [right]

Compares a calculated numeric value without creating a separate Logic variable. The left value can be a tag, then the card applies +, -, * or / before comparing against the right value.

Parameters:

  • left_value - Source value, for example a temperature tag
  • math_operator - Add, subtract, multiply or divide
  • operand_value - Number used by the math operator
  • comparison_operator - Greater than, less than, equal, etc.
  • right_value - Value or tag to compare against

Heat pump / aircondition example:

AND Temperature + 0 is greater than or equal to low_threshold_livingroom

THEN Run the Gradient Map branch and set fan speed from the mapped result

Gate [gate_name] is [GO/NO GO]

Instantly checks if a Conditional Gate is currently GO or NO GO without waiting. No device needed.

Parameters:

  • gate_name - Name of the gate to check (autocomplete)
  • state - GO or NO GO (dropdown)

Example:

WHEN Door opened

AND Gate "allow_lights" is GO

THEN Turn on lights

See Conditional Gates documentation for complete details.

Conditional Gate [gate_name] (Wait for GO)

Pauses the flow until the specified gate becomes GO, or until timeout expires. No device needed.

Parameters:

  • gate_name - Name of the gate to wait for (autocomplete)
  • default_state - Initial state if gate doesn't exist yet (GO or NO GO)
  • timeout_value - Maximum wait time (number, 0 = instant check)
  • timeout_unit - s/m/h (dropdown)

Example:

WHEN Doorbell pressed

AND Conditional Gate "DoorApproved" (Default: NO GO, Timeout: 30 seconds)

THEN Unlock the door

Timeout 0 acts as an instant filter: if gate is NO GO, flow stops immediately. See Conditional Gates documentation.

⏱️ Homey stops app Flow cards after 60 seconds, so this card waits at most 55 seconds and then ends with an error. For longer waits use Start waiting for Conditional Gate GO with the Conditional Gate wait finished trigger.

Wait until [device].[capability] becomes [value]

BETA

Pauses flow execution and waits for a device capability to reach a target value. Creates YES/NO paths.

Parameters:

  • device - Device to monitor (autocomplete)
  • capability - Capability to watch (dropdown, dynamic)
  • target_value - Value to wait for (text/number)
  • timeout_value - Maximum wait time (number)
  • timeout_unit - ms/s/m/h (dropdown)
  • waiter_id - Optional ID (auto-generated if empty)

Example:

WHEN Motion detected in hallway

AND Wait until [Hallway Light].onoff becomes [true] (timeout: 30 seconds)

THEN ✅ Announce "Light confirmed on"

ELSE ❌ Notify "Light didn't turn on - check bulb?"

⏱️ Homey stops app Flow cards after 60 seconds, so this card waits at most 55 seconds and then ends with an error (also with timeout 0). For longer waits use Start waiting until device capability becomes value with the Capability wait finished trigger.

⚠️ Experimental Feature

See Waiter Gates documentation for complete details and limitations.

THEN Cards (Actions)

Action

Set input [input] to [value]

Manually sets an input value for formula evaluation.

Parameters:

  • input - Which input (A, B, C...J) (dropdown)
  • value - true or false (dropdown)

Variants:

  • Set all inputs to [value] - Set all inputs at once
  • Set input [input] value to [device].[capability] - Use device capability as value

Example:

WHEN Door opened

THEN Set input [A] to [true]

💡 Input values trigger formula re-evaluation automatically

Evaluate formula [formula]

Manually triggers formula evaluation with current input values.

Parameters:

  • formula - Which formula to evaluate (dropdown)

Variants:

  • Evaluate all formulas - Evaluate all formulas at once (Logic Unit only)
  • Evaluate expression [expression] - Evaluate custom expression on-the-fly

Example:

WHEN Settings changed

THEN Evaluate all formulas

💡 Useful after setting multiple inputs, or to force re-evaluation

Evaluate [[input]] [[op1]] min [[logical_op]] [[op2]] max with rules [[rules]]

Range checking and value mapping with AND/OR logic. No device needed - use directly in flows.

Parameters:

  • input - The value to evaluate (number)
  • op1 - First comparison operator (e.g., ≥)
  • logical_op - AND or OR
  • op2 - Second comparison operator (e.g., ≤)
  • rules - Min,max values (e.g., "18,24")

Output tokens:

  • output - Result value
  • error_message - Error message if evaluation fails

Example: Check comfortable temperature (18-24°C):

Input: temperature token, Rules: 18,24, Operators: ≥ AND ≤

Map [input] in range [from] to [to] into [output from] - [output to]

Maps a numeric input from one range into another and returns the result as a Mapped value tag for the next Advanced Flow card. Values outside the input range are clamped, and the result can be rounded to a selected step.

Parameters:

  • input_value - Current value, for example a temperature tag
  • from_num / to_num - Input range start and end
  • from_num_offset / to_num_offset - Optional offsets, default 0
  • from_out / to_out - Output range start and end
  • round_to - Rounding step, default 1. Examples: 1, 0.5, 0.05, 10

Output token:

  • Mapped value - The mapped and rounded number. Use this tag from the same Map card branch.

Heat pump / aircondition fan example:

WHEN Temperature changes

AND Temperature is less than low_threshold_livingroom

THEN Set fan speed to 0%

WHEN Temperature changes

AND Temperature is greater than or equal to low_threshold_livingroom

THEN Map Temperature in range low_threshold_livingroom to high_threshold_livingroom into 100-500, round to 1

THEN Set the heat pump fan speed to Mapped value

If a flow has more than one Map card, choose the Mapped value tag from the Map card on the same branch as the fan-speed action.

Get the name of [this Flow]

Returns the name, id and folder of the Advanced Flow the card is in, as tags for the next cards. The card and its messages are translated into all of the app's languages. Useful in notifications and logs, so you can see which Flow sent them without typing the name by hand. Advanced Flow only: Homey does not show THEN cards with tags in standard Flows.

Parameters:

  • flow - Click the field and pick the only choice, this Flow. Required.

Output tokens:

  • Flow name - The Flow's current name, or a marker such as [Duplicate] when the Flow cannot be named
  • Flow id - The Flow's id (empty when the Flow cannot be named)
  • Folder - Name of the folder the Flow is in (empty when it is not in a folder)
  • Has error - Yes/no: yes when the Flow cannot be named
  • Error message - Empty when all is well, otherwise what to do

How it finds the Flow:

Homey does not tell a card which Flow it runs in, and apps may read Flows but not change them. When you pick this Flow, the card gets its own id, and Homey saves it with the Flow. Each time the card runs, the app looks up which Flow holds that id and reads its current name, so renaming the Flow needs nothing.

When the Flow cannot be named:

  • [Duplicate] - The card has been copied, or the Flow duplicated, so the same id is in several Flows. Error message names them. Open the card in the copy and pick this Flow again.
  • [Unknown – save the Flow] - The id is not in any saved Flow, for example when you test a Flow before saving it.
  • [Not set] - Nothing is picked in the field.

In these cases the card still continues on its normal output, because Homey drops a card's tags when it takes the error output. The error output is only used when the app cannot read the Flows at all. To branch on a problem, add a Logic condition on Has error after the card.

Modify Conditional Gate [gate_name] → [new_state]

Changes the state of a Conditional Gate (Open/Close) or updates the timeout of active waiters. No device needed.

Parameters:

  • gate_name - Name of the gate to modify (autocomplete)
  • new_state - GO, NO GO, Toggle, or Don't change (dropdown)
  • new_timeout_value - Update timeout for waiting flows (-1 = no change)
  • new_timeout_unit - s/m/h (dropdown)

Output tokens:

  • gate_state - Boolean: true if gate is GO after action

Example:

WHEN Time is 23:00

THEN Modify Conditional Gate "allow_lights" → NO GO

To read state without changing: use "Don't change" + timeout -1. State and timeout changes apply to in-card and background waits alike. See Conditional Gates documentation.

Start waiting for gate [gate_name] to become GO

Starts a background wait and continues immediately, so it works for waits longer than Homey's 60-second Flow card limit. The Conditional Gate wait finished trigger fires when the gate becomes GO or the timeout expires. No device needed.

Parameters:

  • gate_name - Name of the gate to wait for (autocomplete)
  • default_state - Initial state if gate doesn't exist yet (GO or NO GO)
  • timeout_value - Maximum wait time (number, 0 = no timeout, max 24 hours)
  • timeout_unit - s/m/h (dropdown)

Example:

WHEN Razor turned on

THEN Start waiting for gate "Razor" to become GO (Default: NO GO, Timeout: 2 minutes)

Gate already GO → the trigger fires immediately. Starting again for the same gate restarts the wait without firing the replaced one. Pending waits are lost if the app restarts.

Clear error

Clears error state for a formula or device.

Variants:

  • Clear error for formula [formula] - Clear specific formula error
  • Clear all errors - Clear all errors on device

Example:

WHEN Configuration updated

THEN Clear all errors

Wait [duration] [unit]

Simple wait/delay action. Pauses flow execution for specified duration.

Parameters:

  • duration - How long to wait (number)
  • unit - Milliseconds, Seconds, Minutes, or Hours (dropdown)

Example:

WHEN Motion detected

THEN Turn on light

THEN Wait [30] [seconds]

THEN Turn off light

💡 This is a simple delay card, not related to Waiter Gates reactive waiting

⏱️ Maximum 55 seconds: Homey stops app Flow cards after 60 seconds, so longer durations fail immediately with a message. Use Homey's built-in Flow delay for longer pauses.

Start waiting until [device].[capability] becomes [value]

BETA

Starts a background wait and continues immediately, so it works for waits longer than Homey's 60-second Flow card limit. The Capability wait finished trigger fires for the Waiter ID when the value is reached or the timeout expires.

Parameters:

  • device - Device to monitor (autocomplete)
  • capability - Capability to watch (dropdown, dynamic)
  • target_value - Value to wait for (text/number, exact match)
  • timeout_value - Maximum wait time (number, 0 = no timeout, max 24 hours)
  • timeout_unit - s/m/h (dropdown)
  • waiter_id - Use a fixed ID so the trigger can select it

Example:

WHEN Front door opened

THEN Start waiting until [Front Door].alarm_contact becomes [false] (timeout: 2 minutes, id: front_door)

Value already matches → the trigger fires immediately. Starting again with the same Waiter ID restarts the wait without firing the replaced one. Pending waits are lost if the app restarts.

Control Waiter Gate [waiter_id] → [action]

BETA

Enable, disable, or stop a running Waiter Gate.

Parameters:

  • waiter_id - ID of the waiter to control (text)
  • action - Enable, Disable, or Stop (dropdown)

Actions:

  • Enable - Re-enable a disabled waiter
  • Disable - Temporarily disable waiter (doesn't stop current wait)
  • Stop - Immediately remove the waiter. A stopped background wait never fires its "wait finished" trigger.

Works for in-card and background waits. Background Conditional Gate waits use the ID gate_<name>_background.

Example:

WHEN Manual override triggered

THEN Control Waiter Gate [door_monitor] → [Stop]

⚠️ Experimental Feature

Part of Waiter Gates system. See full documentation.

Device-Specific Cards

Logic Device Only

  • ✓ State changed trigger (with tokens)
  • ✓ Device alarm state changed trigger
  • ✓ Device on state changed trigger

These cards leverage the Logic Device's unified state model

Logic Unit Only

  • ✓ Evaluate all formulas action
  • ✓ Set all inputs action
  • ✓ Multiple formula management

Logic Unit excels at managing complex multi-formula scenarios

Common Flow Patterns

Pattern 1: Simple Logic Flow

WHEN Motion detected

THEN Set input A to true

→ Formula evaluates automatically, triggers other flows if result changes

Pattern 2: React to Logic Result

WHEN Formula [security] changed to TRUE

THEN Turn on alarm

THEN Send notification

Pattern 3: Multi-Step Logic Setup

WHEN Time is sunset

THEN Set input A to true

THEN Set input B to [Living Room].motion

THEN Evaluate formula [evening_mode]

Pattern 4: Error Handling

WHEN Formula [critical] timed out

THEN Send notification "Formula timeout"

THEN Clear error for formula [critical]

THEN Evaluate formula [critical]

Pattern 5: Conditional Gate Flow Control

WHEN Door opened

AND Gate "allow_lights" is GO

THEN Turn on lights

→ Gate acts as simple GO/NO GO filter - no device needed

Pattern 6: Reactive Wait (BETA)

WHEN Button pressed

AND Wait until [Device].capability becomes [value]

THEN ✅ Action for success

ELSE ❌ Action for timeout

→ Up to 55 seconds; Homey stops app Flow cards after 60 seconds

Pattern 7: Long Wait (minutes or hours)

WHEN Razor turned on

THEN Start waiting for gate "Razor" to become GO (timeout: 2 minutes)

WHEN Conditional Gate wait finished "Razor"

THEN Turn off Razor

→ The app waits in the background and fires the trigger; both parts can sit on one Advanced Flow canvas

💡 Pro Tips

↑ Back to top