Skip to content

Navigation Menu

Sign in
Sign up
KNOOP edited this page Aug 3, 2026 · 8 revisions

Intent Launcher

The Android Intent Executor allows you to remotely execute Android Intents from Home Assistant: open apps/settings (launch), or send broadcast intents (Home Assistant Companion compatible).


Overview

Exposes the ESPHome service launch_intent with one required field, intent_uri. Keeping the service to one field avoids ESPHome exposing optional intent properties as required fields in Home Assistant.

Mode Equivalent HA Companion command
Launch / activity URI command_activity (URI style)
Broadcast command_broadcast_intent

Setup

  1. SettingsDevice ControlsDiagnostic Sensors
  2. Enable Android Intent Executor
  3. Enable Show in Home Assistant

After enabling the service or upgrading from an older multi-field version, restart the voice satellite or reload the ESPHome integration so Home Assistant refreshes the schema.


Service field

Field Purpose
intent_uri Launch URI, Android intent URI, or broadcast:... URI

Auto dispatch

  1. intent_uri starts with broadcast: → broadcast
  2. Otherwise → activity/URI launch

Broadcast URI

Broadcast properties are encoded in the one URI field:

Property URI source
action Bare body, action query parameter, or Android intent action
package Optional package query parameter or Android intent package
class Optional class query parameter or Android intent component
extras Optional extras query parameter or Android intent extras

broadcast:ACTION sends an implicit broadcast. Add ?package=PACKAGE to target one application. Query parameter values must be URL-encoded when they contain &, = or #.

HA Companion aliases (0.6.4): the long-form Home Assistant Companion query keys intent_action, intent_package_name, intent_class_name, and intent_extras are also accepted as aliases for action/package/class/extras inside the same intent_uri query string — useful when copying examples straight from HA Companion docs. Values embedded directly in the URI always win; the aliased keys only fill in whatever the URI itself did not specify.


Launch examples

action: esphome.device_name_launch_intent
data:
 intent_uri: "spotify://"
# System settings
intent_uri: "intent:#Intent;action=android.settings.SETTINGS;end"

Broadcast examples

Toggle Ava mic

action: esphome.device_name_launch_intent
data:
 intent_uri: "broadcast:com.example.ava.ACTION_TOGGLE_MIC"

Third-party broadcast

The short form sends an implicit broadcast:

intent_uri: "broadcast:com.sendspinlite.ACTION_DUCK"

Use the package form when the receiver requires an explicitly targeted broadcast:

intent_uri: "broadcast:com.sendspinlite.ACTION_DUCK?package=com.sendspinlite"

Sleep as Android (HA docs example)

intent_uri: "broadcast:com.urbandroid.sleep.alarmclock.START_SLEEP_TRACK?package=com.urbandroid.sleep"

With extras

intent_uri: "broadcast:?action=com.urbandroid.sleep.alarmclock.ALARM_STATE_CHANGE&package=com.urbandroid.sleep&extras=alarm_label%3Awork%2Calarm_enabled%3Afalse"

Enable a mod

intent_uri: "broadcast:?action=com.example.ava.ACTION_SET_MOD_ENABLED&package=com.example.ava&extras=mod_id%3Aecho_dot_led%2Cmod_enabled%3Atrue"

Query-style URI (all in intent_uri)

intent_uri: "broadcast:?action=com.example.ava.ACTION_APPLY_SETTINGS&package=com.example.ava&extras=setting_path%3Amicrophone.voicePrintEnabled%2Csetting_bool%3Atrue"

Extras types (HA Companion)

The decoded extras query value uses name:value pairs separated by ,. Arrays use ; between values. Append :type for explicit types.

Guessing without type: digits → int, true/false → boolean, else string.

Type Example
Integer EXTRA:101:int
Integer Array EXTRA:101;102;103:int[]
ArrayList<Integer> EXTRA:1;2;3:ArrayList<Integer>
Double EXTRA:10.1:double
Double Array EXTRA:10.1;10.2;10.3:double[]
Float EXTRA:10.1:float
Float Array EXTRA:10.1;10.2;10.3:float[]
Long EXTRA:101:long
Long Array EXTRA:101;102;103:long[]
Short EXTRA:1:short
Short Array EXTRA:1;2;3:short[]
Byte EXTRA:127:byte
Byte Array EXTRA:127;64:byte[]
Boolean EXTRA:true:boolean
Boolean Array EXTRA:true;true;false:boolean[]
Char EXTRA:a:char
Char Array EXTRA:a;b;c:char[]
String EXTRA:abc:String
String (urlencoded) EXTRA:%2C%3A%3B:String.urlencoded
String Array EXTRA:a;b;c:String[]
String Array (urlencoded) EXTRA:colon%3A;semicolon%3B:String[].urlencoded
ArrayList<String> EXTRA:a;b;c:ArrayList<String>
ArrayList<String> (urlencoded) EXTRA:colon%3A;comma%2C:ArrayList<String>.urlencoded

Also accepted: :urlencoded and docs alias :ArrayList.urlencoded.


Use Cases & Scenarios

Morning routine

Open Spotify, then switch to the display settings page five seconds later:

automation:
 - alias: "Morning Device Setup"
 trigger:
 - platform: time
 at: "07:00:00"
 action:
 - service: esphome.ava_launch_intent
 data:
 intent_uri: "spotify://"
 - delay: "00:00:05"
 - service: esphome.ava_launch_intent
 data:
 intent_uri: "intent:#Intent;action=android.settings.DISPLAY_SETTINGS;end"

Voice-controlled app launch

automation:
 - alias: "Launch Netflix by Voice"
 trigger:
 - platform: conversation
 command: "launch netflix"
 action:
 - service: esphome.ava_launch_intent
 data:
 intent_uri: "netflix://"

Control Ava itself (headless)

No UI opens — the device just reacts:

# Toggle microphone
intent_uri: "broadcast:com.example.ava.ACTION_TOGGLE_MIC"
# Restart the voice satellite
intent_uri: "broadcast:com.example.ava.ACTION_RESTART_VOICE_SATELLITE"
# Check for updates
intent_uri: "broadcast:com.example.ava.ACTION_CHECK_UPDATE"

Full list of Ava control broadcasts: ADB Commands.

Talk to Tasker / MacroDroid / KWGT

Trigger a Tasker task by name (extras are packed into the one URI):

intent_uri: "broadcast:net.dinglisch.android.tasker.ACTION_TASK?package=net.dinglisch.android.taskerm&extras=task_name%3ABedtime"

Refresh a KWGT widget:

intent_uri: "broadcast:org.kustom.action.REFRESH_WIDGET?package=org.kustom.widget"

Weather-aware entertainment

automation:
 - alias: "Weather-Appropriate Entertainment"
 trigger:
 - platform: state
 entity_id: sensor.weather_condition
 action:
 - choose:
 - conditions:
 - condition: state
 entity_id: sensor.weather_condition
 state: "rainy"
 sequence:
 - service: esphome.ava_launch_intent
 data:
 intent_uri: "netflix://"
 - conditions:
 - condition: state
 entity_id: sensor.weather_condition
 state: "sunny"
 sequence:
 - service: esphome.ava_launch_intent
 data:
 intent_uri: "spotify://playlist/outdoor"

Movie night (chained broadcasts)

Because broadcasts don't open a window, you can fire several in a row without anything jumping on screen:

automation:
 - alias: "Movie Night on Ava Panel"
 trigger:
 - platform: state
 entity_id: input_select.house_mode
 to: "movie"
 action:
 - service: esphome.ava_launch_intent
 data:
 intent_uri: "intent:#Intent;action=android.settings.DISPLAY_SETTINGS;end"
 - service: esphome.ava_launch_intent
 data:
 intent_uri: "broadcast:com.spotify.music.playlist?package=com.spotify.music&extras=playlist%3Achill"
 - service: esphome.ava_launch_intent
 data:
 intent_uri: "broadcast:com.example.ava.ACTION_RESTART_VOICE_SATELLITE"

Motion-triggered snapshot

automation:
 - alias: "Motion Snapshot from Front Door"
 trigger:
 - platform: state
 entity_id: binary_sensor.front_door_motion
 to: "on"
 action:
 - service: esphome.hallway_launch_intent
 data:
 intent_uri: "broadcast:com.example.ava.ACTION_SCREENSHOT?extras=path%3A%2Fsdcard%2FAva%2Fsnapshots%2Ffront_door.jpg"

App Integration Examples

Category App Intent URI
Entertainment Spotify spotify://
Entertainment Netflix netflix://
Entertainment YouTube youtube://
Entertainment Plex plex://
Communication WhatsApp whatsapp://
Communication Telegram tg://
Communication Discord discord://
System WiFi settings intent:#Intent;action=android.settings.WIFI_SETTINGS;end
System Bluetooth settings intent:#Intent;action=android.settings.BLUETOOTH_SETTINGS;end
System Display settings intent:#Intent;action=android.settings.DISPLAY_SETTINGS;end
System App info intent:#Intent;action=android.settings.APPLICATION_DETAILS_SETTINGS;end

Finding an app's intent URI

  1. Check the app's own developer documentation
  2. Monitor adb logcat while opening the app manually
  3. Use a third-party inspector such as "Intent Interceptor"
  4. Search the Home Assistant community forums
  5. Trial and error: try appname:// or com.package.name

Working with Other Automation Tools

  • Tasker — Intent Launcher is the bridge between HA state and Tasker's device-level automation. Example: an HA automation fires a Tasker task via broadcast when the battery drops below 20%, while HA adjusts lighting to indicate charging.
  • Automate — inject smart-home context into an Automate flow, or have Automate trigger an app launch through HA.
  • Android Shortcuts — turn a static shortcut into a context-aware one, e.g. a "Movie Time" shortcut that opens Disney+ instead of Netflix when the kids are home.

Status entity

sensor.your_device_name_intent_launcher_status

FAQ

Why did older releases require every field?

ESPHome’s service schema has no optional-argument flag. Ava now exposes only intent_uri and parses all properties from it. If Home Assistant still shows the old fields, restart the voice satellite or reload the ESPHome integration.

Intent not executing?

  1. Intent Launcher + Show in Home Assistant enabled
  2. After schema change, reconnect device / reload ESPHome integration
  3. Verify that HA shows only intent_uri
  4. Add ?package=PACKAGE if an implicit third-party broadcast is not received
  5. URL-encode query values containing reserved characters

Broadcast vs launch

  • Launch opens a UI (startActivity)
  • Broadcast notifies a receiver (sendBroadcast) — screen may not change

Best Practices

  1. Test each intent_uri manually (e.g. via the HA Developer Tools service call) before wiring it into an automation
  2. Add short delay: steps between chained launches so the target app has time to come to the foreground
  3. Prefer broadcast: over launch when you don't want the screen to change
  4. Add ?package=PACKAGE whenever a third-party broadcast isn't received — many OEM ROMs block implicit broadcasts
  5. Keep a personal list of working intent_uri values; app updates occasionally change their URI scheme

Back to Home

Clone this wiki locally

AltStyle によって変換されたページ (->オリジナル) /