Home Assistant
Toggle, dim and run Home Assistant entities from the panel
palupdated 2026-10-27IntegrationIn pal's registry
In pal's registry: the button shows it in pal, which asks before installing; the command does the same from a terminal. This page can't see what your pal has installed.





What it does
Your Home Assistant entities in the panel with their state: toggle lights, dim, set a temperature, lock a door, run a scene. Every service is a form, and areas list their own entities.
- Every entity at the root with its state (
on,locked,playing); favourites first, a filter per domain - The right actions per kind: toggle and dim a light, set a thermostat, open a cover, lock a door, run a scene
- Brightness, temperature and volume typed straight into the search bar
- Every service as a form, its fields taken from Home Assistant
- Areas as lists of their entities;
cmd+oopens an entity in Home Assistant - A hotkey on any entity toggles it without showing the panel
Palettes 3
-
Home Assistant
entitiesliveEvery entity of the chosen domains with its state, favourites first; the domain filters scope it. Actions per domain: toggle, on, off, brightness, temperature, open, close, lock, play, activate, run, trigger, copy value; every row copies its id, shows its attributes, opens in HA.
- ↵The domain's first action: toggle, activate, run, copy value
- ⌘↵The second: turn on or off, set, pause
- ⌘BSet a light's brightness to the percent typed in the bar
- ⌘USet a media player's volume to the percent typed in the bar
- ⌘CCopy the entity id
- ⌘⇧AShow the attributes
- ⌘OOpen in Home Assistant
- ⇥All entities, Every domain, one domain
-
Home Assistant Services
serviceslistrefreshes every 1hEvery service Home Assistant offers, by domain; Enter opens a form with the target entity and the service's fields, submit calls it.
- ↵Open the form, then call
- ⌘CCopy the service id
-
Home Assistant Areas
areaslistrefreshes every 1hEvery area with an entity in it; Enter lists those entities.
- ↵List the area's entities
Actions
- ToggleLights, switches, fans, input booleans.↵
- Turn on / Turn off⌘↵
- Set brightnessA light: the percent typed in the bar, light.turn_on with brightness_pct.⌘B
- Set temperatureThe bar takes a thermostat's temperature (the current one prefilled, its range as the hint) and mode, then climate.set_temperature.↵
- Open / Close / StopCovers.
- Lock / UnlockBoth ask first.
- Play / Pause, Next track, Previous track, Turn offMedia players.
- Set volumeA media player: the percent typed in the bar, media_player.volume_set.⌘U
- Activate / Run / TriggerScenes, scripts, automations; Enable or Disable for an automation.
- PressButtons.
- Start / Return to dockVacuums.
- Copy valueSensors, people and every other domain.↵
- Copy entity id⌘C
- Show attributesA level with the state and every attribute; each row copies its value.⌘⇧A
- Open in Home AssistantThe automation or script editor, the history page for the rest.⌘O
- CallOn a service: the form, then the call.↵
- Copy service id⌘C
- Show entitiesOn an area.↵
Settings
Extension, [extensions.home-assistant]
urlWhere Home Assistant answers, scheme included; no trailing slash needed.
tokenA long-lived access token (your profile in HA, Security, Long-lived access tokens). Stored as a keychain: or env: reference.
domainsEntity domains listed at the root, in this order. A domain filter shows its domain regardless; favourites are listed regardless.
favoritesEntity ids pinned to the top, in this order.
timeoutHow long one request may take before the row says Home Assistant did not answer.
Defaults shown. Change them in pal's settings window or in the config file.
The README
Everything Home Assistant does, key by key, from the extension's own README.md
Home Assistant
Home Assistant over its REST API (/api/states, /api/services, one
/api/template render for areas), with a long-lived access token. Three
palettes: the entities, the services, the areas.
Palettes
Home Assistant (entities) is live: every entity of the domains
setting, listed again whenever the panel shows, so a light's state at
the root is the current one and kitchen light finds it from the root.
Favourites come first in their order, then the domains in the setting's
order, names sorted within. A row is the friendly name; the subtitle is
the domain and the area (when the entity has one); the entity id, domain
and area are keywords; the accessories are the state (a coloured tag for
on, off, open, locked, playing and the other known states, the
value with its unit otherwise) and when it last changed. The icon is the
domain's glyph; a light that is on is a dot in its colour (rgb_color,
else warm white). The filter dropdown scopes it: All entities (the
domains setting), Every domain, then Lights, Switches, Sensors, Binary
sensors, Climate, Media players, People, Scripts, Automations, Scenes.
The detail pane (lazy, asked when the cursor rests) leads with the
domain and area, the name and a known state as a chip, and the numbers
that matter large (a sensor's value, a light's brightness, a
thermostat's reading and target, a player's volume); the entity id,
when it changed and the other attributes follow.
Home Assistant Services (services) is every service from
/api/services, by domain then name, the id (light.turn_on) as an
accessory and a keyword, HA's name and description when it gives them.
enter opens a form: the target as a select of the entities the service
takes (no field for a service without a target), then the service's
fields from its description (a select selector is a select, a
boolean one a checkbox, the rest text with the example as placeholder
and a number's range in the help line). The submit calls the service
with the values coerced by selector and toasts what changed; a number
field that is not one comes back on the form. Listed once an hour.
Home Assistant Areas (areas) is every area that has an entity,
with the count; enter lists those entities. Listed once an hour.
Keyboard
The first action of a row is enter, the second cmd+enter; cmd+k
has them all. By domain on an entity row:
| domain | actions |
|---|---|
| light | Toggle, Turn on, Turn off, Set brightness (cmd+b: argument brightness, a percent typed in the bar, light.turn_on with brightness_pct; a pick without it asks in a form) |
| switch, fan, input_boolean, humidifier | Toggle, Turn on, Turn off |
| climate | Set temperature (arguments in the bar: temperature, the current one prefilled and the entity's range as the hint; hvac_mode, a select from its hvac_modes; a pick without them asks in a form), Turn on, Turn off |
| cover | Open, Close, Stop (Close first while open) |
| lock | Lock, Unlock (both ask first; the one that changes the state comes first) |
| media_player | Play or Pause, Next track, Previous track, Set volume (cmd+u: argument volume, a percent typed in the bar, media_player.volume_set), Turn off |
| scene | Activate |
| script | Run |
| automation | Trigger, Enable or Disable |
| button, input_button | Press |
| vacuum | Start, Return to dock |
| anything else (sensor, binary_sensor, person, ...) | Copy value |
On every entity row:
| keys | action |
|---|---|
cmd+c |
Copy entity id |
cmd+shift+a |
Show attributes: a level with the state and every attribute as rows, each copying its value (cmd+c its name) |
cmd+o |
Open in Home Assistant: the automation or script editor, the history page for the rest |
On a service row: enter Call (the form, then the call), cmd+c Copy
service id. On an area row: enter Show entities.
A service call keeps the panel open and lists again, so the row shows the new state, with a toast naming it; a call that fails is a failure toast with HA's answer. Entity ids are the row ids, so an item hotkey toggles one entity without showing pal:
[palettes.home-assistant-entities.item_hotkeys]
"light.kitchen" = "ctrl+alt+k"
Setup
In Home Assistant, your profile, Security, create a long-lived access
token. In pal, Settings › Extensions › Home Assistant: the URL with its
scheme (http://homeassistant.local:8123) and the token, which the
config file keeps as a keychain: or env: reference, never the value.
Settings, [extensions.home-assistant]:
| key | type | default | what |
|---|---|---|---|
url |
text | unset | Where Home Assistant answers, scheme included. |
token |
secret | unset | A long-lived access token. A keychain: or env: reference in the file. |
domains |
list | light, switch, climate, media_player, cover, lock, fan, scene, script, automation, sensor, binary_sensor, person, input_boolean |
The domains listed at the root, in this order. |
favorites |
list | [] |
Entity ids pinned to the top, in this order, whatever their domain. |
timeout |
number (s) | 5 |
How long one request may take. |
When something is wrong every palette is one inert hint row that says
what and where to fix it: no URL, a URL without a scheme, no token, a
keychain: or env: token that did not resolve, a rejected token (401),
a host that did not answer within the timeout, or one that could not be
reached. A URL that redirects (an http:// one behind a proxy answering
301 to https://) is followed with the token kept, and the log says
which URL to set. An HA that refuses the template API leaves the rows
without areas and the Areas palette with a hint row.
Needs the network: every request goes to the URL you set, nothing else.
What it does not do
- No WebSocket: states are read on each show, not pushed, so a change
made elsewhere shows on the next show or
cmd+r. - No entity editing, no dashboards, no history graphs:
cmd+oopens the right page in Home Assistant for those. - A collapsed group in a service's description (HA's "advanced" section) is left out of the form.
Platforms
macOS and Linux, the same on both: everything is HTTP.


