-
-
Notifications
You must be signed in to change notification settings - Fork 20
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).
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 |
- Settings → Device Controls → Diagnostic Sensors
- Enable Android Intent Executor
- 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.
| Field | Purpose |
|---|---|
intent_uri |
Launch URI, Android intent URI, or broadcast:... URI |
-
intent_uristarts withbroadcast:→ broadcast - Otherwise → activity/URI launch
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.
action: esphome.device_name_launch_intent data: intent_uri: "spotify://"
# System settings intent_uri: "intent:#Intent;action=android.settings.SETTINGS;end"
action: esphome.device_name_launch_intent data: intent_uri: "broadcast:com.example.ava.ACTION_TOGGLE_MIC"
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"
intent_uri: "broadcast:com.urbandroid.sleep.alarmclock.START_SLEEP_TRACK?package=com.urbandroid.sleep"
intent_uri: "broadcast:?action=com.urbandroid.sleep.alarmclock.ALARM_STATE_CHANGE&package=com.urbandroid.sleep&extras=alarm_label%3Awork%2Calarm_enabled%3Afalse"
intent_uri: "broadcast:?action=com.example.ava.ACTION_SET_MOD_ENABLED&package=com.example.ava&extras=mod_id%3Aecho_dot_led%2Cmod_enabled%3Atrue"
intent_uri: "broadcast:?action=com.example.ava.ACTION_APPLY_SETTINGS&package=com.example.ava&extras=setting_path%3Amicrophone.voicePrintEnabled%2Csetting_bool%3Atrue"
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.
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"
automation: - alias: "Launch Netflix by Voice" trigger: - platform: conversation command: "launch netflix" action: - service: esphome.ava_launch_intent data: intent_uri: "netflix://"
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.
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"
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"
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"
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"
| Category | App | Intent URI |
|---|---|---|
| Entertainment | Spotify | spotify:// |
| Entertainment | Netflix | netflix:// |
| Entertainment | YouTube | youtube:// |
| Entertainment | Plex | plex:// |
| Communication | 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 |
- Check the app's own developer documentation
- Monitor
adb logcatwhile opening the app manually - Use a third-party inspector such as "Intent Interceptor"
- Search the Home Assistant community forums
- Trial and error: try
appname://orcom.package.name
- 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.
sensor.your_device_name_intent_launcher_status
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 Launcher + Show in Home Assistant enabled
- After schema change, reconnect device / reload ESPHome integration
- Verify that HA shows only
intent_uri - Add
?package=PACKAGEif an implicit third-party broadcast is not received - URL-encode query values containing reserved characters
- Launch opens a UI (
startActivity) - Broadcast notifies a receiver (
sendBroadcast) — screen may not change
- Test each
intent_urimanually (e.g. via the HA Developer Tools service call) before wiring it into an automation - Add short
delay:steps between chained launches so the target app has time to come to the foreground - Prefer
broadcast:over launch when you don't want the screen to change - Add
?package=PACKAGEwhenever a third-party broadcast isn't received — many OEM ROMs block implicit broadcasts - Keep a personal list of working
intent_urivalues; app updates occasionally change their URI scheme
Back to Home
- Quick-Start
- System-Requirements
- Voice-Control
- Chorus-Wake
- ESPHome-Encryption
- HA-Direct-Connection
- Browser
- Screensaver
- Floating-Windows
- Home-Launcher
- Home-Screen-Widgets
- Notification-Scenes
- Quick-Entity
- Sensors
- Backup
- Sendspin
- Bluetooth
- Voice-Messages-Calls
- Music-Playback
- Camera
- Screen-Control
- Intent-Launcher
- ADB-Commands
- Mod-Store
- Ava-Fleet