Waiter Gates BETA

Reactive flow cards that pause and wait for device states to change

⚠️ Experimental Feature

I'm still exploring if Waiter Gates provide real value in practice. Your feedback is welcome! This feature may evolve or change based on user experience.

What Are Waiter Gates?

Waiter Gates let your flows pause and wait for specific device states to change, with YES/NO paths based on the outcome:

How It Works

  1. Flow hits the wait condition - Checks the current value immediately
  2. Already matches? → Continue immediately (YES path) ✅
  3. Doesn't match? → Register listener and wait for change ⏳
  4. Value changes to target? → YES path ✅
  5. Timeout expires? → NO path ❌
  6. Same Waiter ID started again while waiting? → the previous run takes the NO path ❌ and the new run takes over the ID

⏱️ Waiting longer than 55 seconds

Homey stops every app Flow card after 60 seconds. A card that is still waiting at that point fails with Timeout after 60000ms, no matter which timeout you configured.

Flow Cards

Wait until device capability becomes value

Type: CONDITION

Waits for a device capability to reach a target value. Has YES/NO paths.

Parameters:

  • Device: The device to monitor
  • Capability: Which capability to watch (e.g., onoff, dim, alarm_motion)
  • Target value: The value to wait for (e.g., true, false, 0.5). Values are compared exactly; comparisons such as >100 are not supported.
  • Timeout: How long to wait before giving up (the card itself waits at most 55 seconds)
  • Waiter ID (optional): Unique identifier (auto-generated if empty)

Example Flow:

WHEN motion detected
AND wait until [Living Room Light].onoff becomes true (timeout: 30 seconds)
THEN ✅ announce "Light turned on!"
ELSE ❌ notify "Light didn't turn on - check bulb?"

Start waiting until device capability becomes value

Type: ACTION

Starts a background wait and lets the flow continue immediately - the card returns before it contacts the device, so a slow or stalled device can never make it hit Homey's 60-second limit. When the capability reaches the target value or the timeout expires, the Capability wait finished trigger fires for this Waiter ID. Use this for anything longer than 55 seconds.

Parameters:

  • Device, Capability, Target value: As for the condition card.
  • Timeout: Seconds, minutes or hours (maximum 24 hours). 0 = no timeout; such a wait is ended as TIMEOUT after 24 hours.
  • Waiter ID: Use a fixed ID (e.g. kettle_boil) so the trigger can select it.

Behaviour:

  • In the background the app first installs the capability listener and then reads the current value. If that value already matches, the trigger fires as soon as it has been read (result MATCHED). Because the listener is installed first, a change during setup is not missed.
  • Starting again with the same Waiter ID while a background wait is pending restarts it; the replaced wait does not fire the trigger. When two starts overlap, the most recent start wins, even if an older start's device lookup finishes later.
  • The timeout and the Waited (seconds) tag count from when the card ran. A slow value read never delays the timeout; if it has not returned by then, the wait ends as TIMEOUT.
  • A Waiter ID can be used by a waiting condition card or by a background wait, not both at the same time; the second one fails with "Waiter ID already exists". A capability wait also cannot use the ID of a pending Conditional Gate background wait (gate_<name>_background), and vice versa.

Capability wait finished

Type: TRIGGER

Fires when a background wait with the selected Waiter ID ends.

Tags:

  • Value matched: Yes/No - true if the target value was reached.
  • Result (MATCHED/TIMEOUT): Text - MATCHED or TIMEOUT.
  • Last value: Text - the last known capability value (empty if unknown).
  • Waited (seconds): Number - how long the background wait ran.

Control waiter gate

Type: ACTION

Enable, disable, or stop a waiter gate by its ID.

Parameters:

  • Waiter ID: The ID of the waiter to control
  • Action: Enable, Disable, or Stop

Actions:

  • Enable: Allows waiter to trigger YES/NO paths. If the target was reached while it was disabled (value still matches, or gate is GO), it completes right away; if only its timeout elapsed, it times out right away.
  • Disable: Prevents waiter from triggering (stays in waiting state). Timeouts, matching values and gate changes are held until it is enabled again. A disabled waiter left for 24 hours after its timeout is removed without output.
  • Stop: Removes waiter completely (no output). 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.

Wait

BONUS

Type: ACTION

Simple delay without device monitoring. Just pauses the flow for a specified time - at most 55 seconds, because Homey stops app Flow cards after 60 seconds. Longer values fail immediately with a message; use Homey's built-in Flow delay for those.

Parameters:

  • Duration: Number value (e.g., 5)
  • Unit: Milliseconds, Seconds, Minutes, or Hours (total at most 55 seconds)

Example:

WHEN motion detected
THEN turn on light
AND wait 5 seconds
AND turn off light

Real-World Examples

💡 Light Confirmation

Verify that a smart bulb actually turned on after sending the command.

WHEN light switch pressed
THEN turn on [Smart Bulb]
AND wait until [Smart Bulb].onoff becomes true (timeout: 10 seconds)
THEN ✅ continue normally
ELSE ❌ send notification "Bulb failed to turn on"
     AND log error

🚪 Door Security (background wait)

Make sure door closes after opening, with notification if it stays open for 2 minutes. Two minutes is longer than Homey's 60-second card limit, so the wait runs in the background.

WHEN front door opened
THEN start waiting until [Front Door].alarm_contact becomes false (timeout: 2 minutes, id: front_door)

WHEN capability wait finished "front_door"
AND "Value matched" tag is No
THEN ❌ send notification "Front door still open!"
     AND flash lights red

🌡️ Temperature Monitoring (background wait)

Wait for heater to reach target temperature, alert if it fails.

WHEN heater turned on
THEN start waiting until [Heater].measure_temperature becomes 22 (timeout: 30 minutes, id: heater_warmup)

WHEN capability wait finished "heater_warmup"
THEN ✅/❌ notify "Heater: [Result] after [Waited (seconds)] s"   (MATCHED or TIMEOUT)

🔌 Device Power State

Verify a device actually switched on after the command. Target values are compared exactly, so wait for a yes/no capability rather than a threshold like >100.

WHEN washing machine program started
AND wait until [Washing Machine].onoff becomes true (timeout: 30 seconds)
THEN ✅ log "Washing machine started"
ELSE ❌ notify "Washing machine didn't start - door open?"

Waiter ID Management

Auto-Generation (Recommended)

Leave the Waiter ID field empty, and the system automatically generates a unique ID like waiter_1704123456789_x3k9m2

Custom IDs

You can provide your own ID for easier control:

light-check-123
door-monitor-main
heater-temp-wait

⚠️ Important: Unique IDs Required

Each waiter ID must be unique across ALL flows. If you use the same ID in multiple flows simultaneously, they will conflict.

⚠️ Known Limitations

Troubleshooting

❌ Waiter not triggering

  • Check that the device capability actually exists
  • Verify the target value format is correct (true/false for boolean, number for numeric)
  • Check Homey app logs for error messages
  • Ensure timeout is long enough for the change to happen

❌ Always takes NO path

  • Check that timeout is reasonable (not too short)
  • Verify the device is actually changing the capability value
  • Use auto-generated IDs to avoid conflicts

❌ Error: "Timeout after 60000ms" or "Homey stops app Flow cards after 60 seconds"

  • The card waited longer than Homey allows for an app Flow card
  • Switch to Start waiting until device capability becomes value and the Capability wait finished trigger (or the Conditional Gate equivalents)
  • For a plain pause, use Homey's built-in Flow delay instead of the Wait card

❌ Error: "Capability not found"

  • The selected capability doesn't exist on the device
  • Check available capabilities in device settings
  • Some capabilities are write-only or read-only

💬 We Need Your Feedback!

Waiter Gates is an experimental feature. I'd love to hear about your experience:

Share your thoughts on the Homey Community Forum or GitHub Issues.

↑ Back to top